Подтвердить что ты не робот

Set и Oldset в sigprocmask()

Я не совсем понял, как использовать sigprocmask(). В частности, как работают set и oldset и его синтаксис и как их использовать.

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

Пожалуйста, объясните, например, чтобы заблокировать, скажем SIGUSR1 в течение нескольких секунд, а затем разблокировать и обработать его.

4b9b3361

Ответ 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}

потому что это предыдущее значение блокирующего набора.