在sigprocmask()中设置和设置
-
09-06-2019 - |
题
我还没有完全理解,如何使用 sigprocmask()
。特别是, set
和 oldset
及其语法如何工作以及如何使用它们。
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
请解释一个例子,阻止,说SIGUSR1几秒钟,然后解锁并处理它。 ­­­­­­­­­­­­&# 173;­­­­­­­­­­­­ ­­­­
解决方案
这个想法是你在 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)
我们会得到这个:
<*>因为这是阻塞集的先前值。