DannyNiu Asked: 2022-01-09 22:33:34 +0800 CST2022-01-09 22:33:34 +0800 CST 2022-01-09 22:33:34 +0800 CST 为什么有必要在 sigwait()'ing 之前阻止信号? 772 在 APUE 第 12 章第 454 页中,提到: 为了避免错误行为,线程必须阻塞它正在等待的信号...... 标准中也有类似的说法: set定义的信号在调用sigwait()时应该被阻塞;否则,行为未定义。 这些文本中讨论了哪些错误/未定义的行为?我在标准中找不到基本原理或应用程序用法,而且我很难理解书中的解释: 如果信号没有被阻塞......,则打开一个计时窗口,其中一个信号可以在线程完成对sigwait. signals real-time 2 个回答 Voted aviro 2022-01-10T00:05:23+08:002022-01-10T00:05:23+08:00 这来自qnx 文档,但它与所有 Unix 和类似 Unix 的发行版相关: 在调用 sigwait() 之前,应该阻止 set 定义的信号。如果您不阻止它们,则会出现竞争条件,即可以在发出呼叫之前传递信号,从而导致呼叫被阻止,您可能不希望它这样做。 Best Answer DannyNiu 2022-01-10T05:27:38+08:002022-01-10T05:27:38+08:00 这个答案首先将读者带到标准制定的历史视角,然后将读者的注意力带到标准的具体文本中,以解释要求的原因。 在 XPG 第 3 期中,引入sigaction了sig*set、sigismember、sigpending、sigprocmask、 和sigsuspend,以符合 POSIX.1-1988 标准。其中,sigaction为指定信号配置提供了最全面和一致的接口;sigpending,sigprocmask并sigsuspend提供了对信号进行细粒度响应的方法。 在 XPG 第 4 期(目前最古老的数字形式)中,sigaltstack引入了、 sig{hold,ignore,pause,relse,set}、 。siginterrupt最新的标准没有说明它们来自哪里,只是说它们都sigaltstack已经过时了,因为它们只在单线程进程中工作。 在 XPG 第 5 期(单一 Unix 规范版本 2)中,引入了pthread_sigmask, sigqueue, sigtimedwait, sigwaitinfo, 并sigwait与 POSIX 实时和线程扩展保持一致。 现在,看看标准中的其他两个地方很重要。 系统接口一般信息卷第一名,信号概念: ...可以“阻止”信号传递到线程。如果与阻塞信号相关的动作不是忽略该信号,并且如果该信号是为线程生成的,则该信号应保持挂起直到它被解除阻塞,当它被选择并通过调用返回时被接受sigwait()函数或与之关联的动作被设置为忽略信号。 显然,除了可能最终忽略信号外,信号还有两种到达进程/线程的方式——被解除阻塞,或者被sigwait(及其兄弟姐妹,如sigtimedwaitand sigwaitinfo)接受 第二名sigaction: 未指定在同一信号的进程内同时使用 sigaction() 和 sigwait() 函数的结果。 显然,sigwait已被设想为处理信号的次要方法。 sigtimedwait和sigwaitinfo接口的基本原理中的以下文本进一步证实了这一点: sigwait 函数为线程提供了一种同步机制来等待异步生成的信号。
这来自qnx 文档,但它与所有 Unix 和类似 Unix 的发行版相关:
这个答案首先将读者带到标准制定的历史视角,然后将读者的注意力带到标准的具体文本中,以解释要求的原因。
在 XPG 第 3 期中,引入
sigaction
了sig*set
、sigismember
、sigpending
、sigprocmask
、 和sigsuspend
,以符合 POSIX.1-1988 标准。其中,sigaction
为指定信号配置提供了最全面和一致的接口;sigpending
,sigprocmask
并sigsuspend
提供了对信号进行细粒度响应的方法。在 XPG 第 4 期(目前最古老的数字形式)中,
sigaltstack
引入了、sig{hold,ignore,pause,relse,set}
、 。siginterrupt
最新的标准没有说明它们来自哪里,只是说它们都sigaltstack
已经过时了,因为它们只在单线程进程中工作。在 XPG 第 5 期(单一 Unix 规范版本 2)中,引入了
pthread_sigmask
,sigqueue
,sigtimedwait
,sigwaitinfo
, 并sigwait
与 POSIX 实时和线程扩展保持一致。现在,看看标准中的其他两个地方很重要。
系统接口一般信息卷第一名,信号概念:
显然,除了可能最终忽略信号外,信号还有两种到达进程/线程的方式——被解除阻塞,或者被
sigwait
(及其兄弟姐妹,如sigtimedwait
andsigwaitinfo
)接受第二名
sigaction
:显然,
sigwait
已被设想为处理信号的次要方法。sigtimedwait
和sigwaitinfo
接口的基本原理中的以下文本进一步证实了这一点: