Идея состоит в том, что вы предоставляете маску в 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}
, поскольку это предыдущее значение набора блокировок.