Subroutine sigprocmask, sigsetmask oder sigblock
Zweck
Legt die aktuelle Signalmaske fest.
Bibliothek
Standard-C-Bibliothek (libc.a)
Syntax
#include <signal.h>
int SignalMask;
Beschreibung
Die Subroutine sigprocmask wird verwendet, um die Signalmaske des aufrufenden Threads zu untersuchen oder zu ändern.
Die Subroutine wird verwendet, um die Signalmaske des aufrufenden Prozesses zu untersuchen oder zu ändern.
Normalerweise sollten Sie die Subroutine sigprocmask (SIG_BLOCK) verwenden, um Signale während eines kritischen Codeabschnitts zu blockieren. Verwenden Sie dann die Subroutine sigprocmask (SIG_SETMASK) , um die Maske auf den vorherigen Wert zurückzusetzen, der von der Subroutine sigprocmask (SIG_BLOCK) zurückgegeben wurde.
Wenn nach dem Aufruf der Subroutine sigprocmask anstehende nicht geblockte Signale vorhanden sind, wird mindestens eines dieser Signale zugestellt, bevor die Subroutine sigprocmask zurückgegeben wird.
Die Subroutine sigprocmask lässt die Blockierung des Signals SIGKILL oder SIGSTOP nicht zu. Wenn ein Programm versucht, ein Signal zu blockieren, gibt die Subroutine sigprocmask keinen Hinweis auf den Fehler.
Parameter
| Element | Beschreibung |
|---|---|
| Vorteile | Gibt an, wie die Gruppe geändert wird. Sie können einen der folgenden Werte aufweisen:
|
| set | Gibt den Signalsatz an. Wenn der Wert des Parameters Set nicht null ist, verweist er auf eine Gruppe von Signalen, die zum Ändern der aktuell blockierten Gruppe verwendet werden sollen. Wenn der Wert des Parameters Set null ist, ist der Wert des Parameters How nicht signifikant und die Prozesssignalmaske bleibt unverändert. So kann der Aufruf verwendet werden, um aktuell blockierte Signale abzufragen. |
| OSet | Wenn der Parameter OSet nicht der Nullwert ist, wird die zum Zeitpunkt des Aufrufs gültige Signalmaske in dem Bereich gespeichert, auf den der Parameter OSet verweist. |
| SignalMask | Gibt die Signalmaske des Prozesses an. |
Kompatibilitätsschnittstellen
Die Subroutine sigsetmask ermöglicht die Änderung der Prozesssignalmaske für die Signalwerte 1 bis 31. Dieselbe Funktion kann für alle Werte mit der Subroutine sigprocmask (SIG_SETMASK) ausgeführt werden. Das Signal des Werts i wird blockiert, wenn das i-te Bit des Parameters SignalMask gesetzt ist.
Nach erfolgreicher Beendigung gibt die Subroutine sigsetmask den Wert der vorherigen Signalmaske zurück. Schlägt das Unterprogramm fehl, wird ein Wert von -1 zurückgegeben und die globale Variable errno wird gesetzt, um den Fehler wie im Unterprogramm sigprocmask anzuzeigen.
Die Subroutine sigblock ermöglicht die logische Verknüpfung von Signalen mit den Werten 1 bis 31 in die aktuelle Prozesssignalmaske. Dieselbe Funktion kann für alle Werte mit der Subroutine sigprocmask (SIG_BLOCK) ausgeführt werden. Das Signal des Werts i wird zusätzlich zu den derzeit geblockten blockiert, wenn das i-te Bit des Parameters SignalMask gesetzt ist.
Es ist nicht möglich, ein Signal SIGKILL oder SIGSTOP mit der Subroutine sigblock oder sigsetmask zu blockieren. Diese Einschränkung wird vom System unbeaufsichtigt auferlegt, ohne einen Fehler anzuzeigen.
Nach erfolgreicher Beendigung gibt die Subroutine sigblock den Wert der vorherigen Signalmaske zurück. Schlägt das Unterprogramm fehl, wird ein Wert von -1 zurückgegeben und die globale Variable errno wird gesetzt, um den Fehler wie im Unterprogramm sigprocmask anzuzeigen.
Rückgabewerte
Nach Beendigung wird der Wert 0 zurückgegeben. Schlägt das Unterprogramm sigprocmask fehl, bleibt die Signalmaske des Prozesses unverändert, es wird der Wert -1 zurückgegeben, und die globale Variable errno wird gesetzt, um den Fehler anzuzeigen.
Fehlercodes
Die Subroutine sigprocmask ist nicht erfolgreich, wenn Folgendes zutrifft:
| Element | Beschreibung |
|---|---|
| EPERM | Der Benutzer verfügt nicht über die Berechtigung zum Ändern der Signalmaske. |
| EINVAL | Der Wert des Parameters How ist ungleich einem der definierten Werte. |
| EFAULT | Die Maske des Benutzers befindet sich nicht im Prozessadressraum. |
Beispiele
Geben Sie Folgendes ein, um die Signalmaske so festzulegen, dass nur das Signal SIGINT für die Zustellung blockiert wird:
#include <signal.h>
int return_value;
sigset_t newset;
sigset_t *newset_p;
. . .
newset_p = &newset;
sigemptyset(newset_p);
sigaddset(newset_p, SIGINT);
return_value = sigprocmask (SIG_SETMASK, newset_p, NULL);