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