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}

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

Другие вопросы по тегам