2008-08-24 27 views
21

Я еще не понял, как использовать sigprocmask(). В частности, как работают set и oldset и его синтаксис и как их использовать.Set and Oldset in sigprocmask()

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 

Пожалуйста, объясните на примере, чтобы блокировать, скажем, SIGUSR1 в течение нескольких секунд, а затем разблокировать и обработать его.

ответ

61

Идея состоит в том, что вы предоставляете маску в set, эффективно список сигналов. Аргумент how говорит, что вы должны делать с маской в ​​set.

Вы можете использовать SIG_BLOCK для блокировки сигналов в списке set, или SIG_UNBLOCK, чтобы разблокировать их. Ни один из них не меняет сигналы, которые не указаны в списке. SIG_SETMASK блокирует сигналы в списке и разблокирует те, которые не указаны в списке.

Например, предположим, что старый список блокировки был {SIGSEGV, SIGSUSP} и вы называете sigprocmask с этими аргументами:

sigset_t x; 
sigemptyset (&x); 
sigaddset(&x, SIGUSR1); 
sigprocmask(SIG_BLOCK, &x, NULL) 

Новый список блокировки теперь будет {SIGSEGV, SIGSUSP, SIGUSR1}.

Если вы звоните sigprocmask с этими аргументами теперь:

sigprocmask(SIG_UNBLOCK, &x, NULL) 

Новый список блокировки будет вернуться к тому {SIGSEGV, SIGSUSP}.

Если вы звоните sigprocmask с этими аргументами теперь:

sigprocmask(SIG_SETMASK, &x, NULL) 

Новый список блокировки теперь будет установлен в {SIGUSR1}.

Аргумент oldset указывает вам, что было в предыдущем списке блокировки. Если у нас есть такое заявление:

sigset_t y; 

и мы называем код в предыдущих примерах, как это:

sigprocmask(SIG_BLOCK, &x, &y) 

теперь мы имеем:

y == {SIGSEGV, SIGSUSP} 

Если теперь мы делаем:

sigprocmask(SIG_UNBLOCK, &x, &y) 

мы получим

y == {SIGSEGV, SIGSUSP, SIGUSR1} 

и если мы делаем:

sigprocmask(SIG_SET, &x, &y) 

мы получим следующее:

y == {SIGSEGV, SIGSUSP} 

, потому что это предыдущее значение набора блокировки.

+0

Этот список {SIGSEGV, SIGSUSP} не отправляется в sigprocmask (SIG_BLOCK, & x, NULL), то почему они блокируются? x содержит только сигуср1. – user2975699 2014-04-07 06:02:38