【问题标题】:Set and Oldset in sigprocmask()sigprocmask() 中的 Set 和 Oldset
【发布时间】:2010-09-06 17:13:59
【问题描述】:

我还没完全明白,sigprocmask()怎么用。特别是setoldset 及其语法如何工作以及如何使用它们。

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

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

【问题讨论】:

    标签: c posix signals sigprocmask


    【解决方案1】:

    这个想法是您在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}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2021-09-10
      • 2016-02-08
      • 2018-10-16
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多