Die Idee ist, dass Sie eine Maske in set
, effektiv eine Liste von Signalen zur Verfügung stellen. Das how
Argument sagt, was Sie mit der Maske in set
tun sollten.
Sie können entweder SIG_BLOCK
verwenden, um die Signale in der set
Liste zu blockieren, oder , um sie zu entsperren. Keine davon ändert die Signale, die nicht in der Liste eingestellt sind. SIG_SETMASK
blockiert die Signale in der Liste und entsperrt diejenigen, die nicht in der Liste festgelegt sind.
Zum Beispiel davon ausgehen, dass die alte Sperrliste war {SIGSEGV, SIGSUSP}
und rufen Sie sigprocmask
mit diesen Argumenten:
sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)
Die neue Sperrliste jetzt {SIGSEGV, SIGSUSP, SIGUSR1}
sein wird.
Wenn Sie rufen sigprocmask
mit diesen Argumenten jetzt:
sigprocmask(SIG_UNBLOCK, &x, NULL)
Die neue Sperrliste gehen zurück {SIGSEGV, SIGSUSP}
zu sein.
Wenn Sie sigprocmask
mit diesen Argumenten call now:
sigprocmask(SIG_SETMASK, &x, NULL)
Die neue Sperrliste wird nun auf {SIGUSR1}
eingestellt werden.
Das Argument oldset
zeigt Ihnen, was die vorherige Sperrliste war. Wenn wir diese Erklärung haben:
sigset_t y;
und wir rufen Sie den Code in den vorherigen Beispielen wie folgt aus:
sigprocmask(SIG_BLOCK, &x, &y)
jetzt haben wir:
y == {SIGSEGV, SIGSUSP}
Wenn wir jetzt tun:
sigprocmask(SIG_UNBLOCK, &x, &y)
erhalten wir
y == {SIGSEGV, SIGSUSP, SIGUSR1}
und wenn wir das tun:
sigprocmask(SIG_SET, &x, &y)
wir diese:
y == {SIGSEGV, SIGSUSP}
weil dies der vorherige Wert des Sperrsatz ist.
Diese Liste {SIGSEGV, SIGSUSP} wird nicht an sigprocmask gesendet (SIG_BLOCK, & x, NULL). Warum werden sie blockiert? x enthält nur sigusr1. – user2975699
@Nathan - Deine Erklärung ist brilliant - sieben Jahre lang auf seiner immer noch soliden Basis, um Leuten zu helfen, sigprocmack zu verstehen :) – oneday