C-Bibliotheksfunktionen -sigprocmask()

C-Standardbibliothek - <signal.h>

Beschreibung

In der Sprache C,sigprocmaskDie Funktion wird verwendet, um die Signalmaske des aktuellen Prozesses zu prüfen oder zu ändern. Die Signalmaske bestimmt, welche Signale während der Maskierung blockiert werden, d. h. vorübergehend nicht verarbeitet werden.

Syntax

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

Parameter

  • int how: Operationsflags, die bestimmen, wie die Signalmaske geändert wird:
    • SIG_BLOCK: übernehmensetDie Signale in der Signalmenge, auf die gezeigt wird, werden zur aktuellen Signalmaske hinzugefügt.
    • SIG_UNBLOCK: aus der aktuellen Signalmaske entfernensetdie Signale in der Signalmenge, auf die gezeigt wird.
    • SIG_SETMASK: verwendensetDie Signalmenge, auf die gezeigt wird, ersetzt die aktuelle Signalmaske.
  • const sigset_t *set: ein Zeiger auf die neue Signalmenge, die für die Änderung verwendet werden soll.
  • sigset_t *oldset: wenn er nichtNULL, dann die vorherige Signalmaske speichern.

Rückgabewert

  • Gibt bei Erfolg 0 zurück.
  • Gibt bei Fehler -1 zurück und setzterrno, um die Art des Fehlers anzugeben.

Beispiel

Das Folgende ist ein einfaches Beispielprogramm, das zeigt, wie mansigprocmaskFunktion zum BlockierenSIGINTein Signal, dann heben Sie dessen Blockierung auf und prüfen Sie die vorherige Signalmaske:

Beispiel

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() {
    sigset_t new_mask, old_mask;
   
    // Initialisiere ein neues Signal-Set, das nur SIGINT enthält
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);

    // Setze die neue Signalmaske, um das SIGINT-Signal zu blockieren
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
        perror("sigprocmask");
        return 1;
    }

    printf("SIGINT-Signal ist blockiert. Schlafe 5 Sekunden...\n");
    sleep(5);

    // Blockierung von SIGINT aufheben
    if (sigprocmask(SIG_UNBLOCK, &new_mask, NULL) == -1) {
        perror("sigprocmask");
        return 1;
    }

    printf("SIGINT-Signal ist entsperrt.\n");

    return 0;
}

Ergebnis ausgeben

Die mögliche Ausgabe beim Ausführen des obigen Beispielprogramms ist wie folgt:

SIGINT signal is blocked. Sleeping for 5 seconds...

Während dieser Zeit ist das SIGINT-Signal blockiert, daher wartet das Programm 5 Sekunden.

SIGINT signal is unblocked.

Dann hebt das Programm die Blockierung aufSIGINTHeben Sie die Blockierung des Signals auf und stellen Sie die normale Verarbeitung des Signals wieder her:

Hinweise

  • NutzungsigprocmaskWenn Sie die Funktion verwenden, achten Sie darauf, dass kritische Signale nicht für lange Zeit blockiert werden (wie z. B.SIGKILLoderSIGSTOP), können diese Signale weder blockiert noch abgefangen werden.
  • sigprocmaskDie Funktion kann verwendet werden, um die Signalbehandlung in kritischen Abschnitten zu steuern, beispielsweise um die Verarbeitung von Unterbrechungssignalen innerhalb eines kritischen Abschnitts zu vermeiden.

C-Standardbibliothek - <signal.h>

Weitere Erweiterungen