sigprocmask()中的Set和Oldset
时间:2020-03-05 18:42:38 来源:igfitidea点击:
我还没有完全了解如何使用sigprocmask()
。特别是,set和oldset及其语法如何工作以及如何使用它们。
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
请举例说明,先说几秒钟,然后说SIGUSR1,然后再解除阻塞并进行处理。
解决方案
回答
这个想法是在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}
因为这是阻止集的先前值。