Set и Oldset в sigprocmask()
Я не совсем понял, как использовать sigprocmask()
, В частности, как set
а также oldset
и его синтаксис работы и как их использовать.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Пожалуйста, объясните на примере, чтобы заблокировать, скажем, SIGUSR1 на несколько секунд, а затем разблокировать и обработать его.
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}
потому что это предыдущее значение набора блокировок.