Вопрос

Я не совсем понял, как пользоваться 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}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top