Set und Oldset in sigprocmask ()
-
09-06-2019 - |
Frage
Ich habe nicht ganz verstanden, wie sigprocmask()
zu verwenden. Insbesondere, wie die set
und oldset
und seine Syntax arbeiten und wie sie verwendet werden.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Bitte mit einem Beispiel erklären, zu blockieren, sagt SIGUSR1 für ein paar Sekunden und dann freizugeben und damit umgehen.
Lösung
Die Idee ist, dass Sie eine Maske in set
bieten, effektiv eine Liste von Signalen. 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 SIG_UNBLOCK
sie zu entsperren. Keines dieser wandelt die Signale, die nicht in der Liste. SIG_SETMASK
blockieren die Signale in der Liste, und deblockiert diejenigen, die nicht in der Liste festgelegt werden.
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 wird nun {SIGSEGV, SIGSUSP, SIGUSR1}
werden.
Wenn Sie sigprocmask
mit diesen Argumenten call now:
sigprocmask(SIG_UNBLOCK, &x, NULL)
Die neue Sperrliste wird zurückgehen {SIGSEGV, SIGSUSP}
zu sein.
Wenn Sie sigprocmask
mit diesen Argumenten call now:
sigprocmask(SIG_SETMASK, &x, NULL)
Die neue Sperrliste wird nun eingestellt werden, um {SIGUSR1}
.
Das oldset
Argument sagt Ihnen, was die bisherige Sperrliste ist. Wenn wir diese Erklärung:
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)
wir bekommen
y == {SIGSEGV, SIGSUSP, SIGUSR1}
und wenn wir das tun:
sigprocmask(SIG_SET, &x, &y)
Wir werden diese:
y == {SIGSEGV, SIGSUSP}
, weil dies der vorherige Wert des Sperrsatzes ist.