我还没完全明白,怎么用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}
因为这是阻塞集的先前值.