Сведения о вопросе

Life

20:48, 11th August, 2020

Теги

c   posix   signals   sigprocmask    

Set и Oldset в sigprocmask()

Просмотров: 444   Ответов: 1

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

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

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



  Сведения об ответе

DINO

10:23, 11th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться