在sigprocmask()中设置和设置

我还没有完全理解,如何使用sigprocmask() 。 特别是, setoldset及其语法如何工作以及如何使用它们。

 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} 

因为这是阻塞集的先前值。