31

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

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

请举例说明,阻止,说 SIGUSR1 几秒钟,然后解除阻止并处理它。

4

1 回答 1

77

这个想法是你提供一个掩码set,实际上是一个信号列表。该how论点说明了您应该如何处理中的掩码set

您可以使用来阻止列表SIG_BLOCK中的信号,也可以取消阻止它们。这些都不会改变未在列表中设置的信号。 阻止列表中的信号,并取消阻止列表中未设置的信号。setSIG_UNBLOCKSIG_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}

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

于 2008-08-24T18:57:50.587 回答