关于sigprocmask(),SIG_BLOCK和SIG_SETMASK

时间:2016-12-27 12:38:10

标签: c unix signals

在第10章APUE的信号中。

我对sigprocmask()SIG_BLOCKSIG_SETMASK有一些疑问。

  1. 书籍说"当我们阻止信号时,我们保存了旧面具"。我的理解是:
  2. 我们声明类型为newmask的{​​{1}},然后sigset_t表示初始化新掩码,以便排除sigempty(&newmask)指向的所有信号,最后添加{{1}到newmask集。

    但我不确定以下是什么意思。 SIGQUITnewmask指向SIG_BLOCK的信号是newmask吗?

    sigprocmask()

    1. "为了解锁信号,我们做了oldmask旧面具。
    2. sigprocmask(SIG_BLOCK, &newmask, &oldmask)SIG_SETMASK,其中包含oldmask,如何取消阻止信号(sigset_t)?

      SIGQUIT

      以下是整个代码:

      SIGQUIT

      非常感谢!

1 个答案:

答案 0 :(得分:1)

  

我们声明一个类型为sigset_t的新掩码,然后sigempty(& newmask)意味着初始化newmask,以便排除newmask指向的所有信号,最后将SIGQUIT添加到新的掩码集。

不完全是。 sigemptyset()所有来自newmask的信号排除在外(即它是信号集)。

  

但我不确定以下是什么意思。是不是将新掩码和sigprocmask()指向的信号SIG_BLOCK到旧掩码?

sigprocmask(SIG_BLOCK, &newmask, &oldmask)使用newmask设置新信号掩码(即如果成功,则只阻止SIGQUIT)并返回{{1}中的信号掩码}}

  

oldmask是一个包含SIGQUIT的sigset_t,如何解锁信号(SIGQUIT)?

那不是真的。 信号掩码是 oldmask被阻止之前的,当您阻止SIGQUIT并存储时,sigprocmask()会返回 SIGQUIT。因此,oldmask恢复旧的信号掩码(无论信号掩码,在<{1}}的调用之前)。