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