2008-08-24 12 views
21

Ich habe nicht vollständig verstanden, wie man sigprocmask() verwendet. Vor allem, wie die set und oldset und ihre Syntax funktionieren und wie Sie sie verwenden.Set und Oldset in sigprocmask()

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.

Antwort

61

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.

+0

Diese Liste {SIGSEGV, SIGSUSP} wird nicht an sigprocmask gesendet (SIG_BLOCK, & x, NULL). Warum werden sie blockiert? x enthält nur sigusr1. – user2975699

+3

@Nathan - Deine Erklärung ist brilliant - sieben Jahre lang auf seiner immer noch soliden Basis, um Leuten zu helfen, sigprocmack zu verstehen :) – oneday