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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top