【发布时间】:2010-09-06 17:13:59
【问题描述】:
我还没完全明白,sigprocmask()怎么用。特别是set 和oldset 及其语法如何工作以及如何使用它们。
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
请举例说明,要阻止,说 SIGUSR1 几秒钟,然后解除阻止并处理它。
【问题讨论】:
标签: c posix signals sigprocmask
我还没完全明白,sigprocmask()怎么用。特别是set 和oldset 及其语法如何工作以及如何使用它们。
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
请举例说明,要阻止,说 SIGUSR1 几秒钟,然后解除阻止并处理它。
【问题讨论】:
标签: c posix signals sigprocmask
这个想法是您在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}
因为这是阻塞集的先前值。
【讨论】: