Set и Oldset в sigprocmask () - PullRequest
       29

Set и Oldset в sigprocmask ()

23 голосов
/ 24 августа 2008

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

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

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

1 Ответ

70 голосов
/ 24 августа 2008

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

, поскольку это предыдущее значение набора блокировок.

...