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