信号是在递交给进程前还是后被忽略?及system()处理SIGCHLD的机制
SIGCHLD信号在system()中的处理流程疑问
问题内容
- 信号是在递交给进程之前还是之后被忽略?
system()函数是如何忽略SIGCHLD信号的?- 手册指出
system()会阻塞SIGCHLD信号,因此该信号会在解除阻塞后被递送。 - 以下哪种流程是正确的:
- system() -> SIGCHLD生成 -> 被阻塞 -> 解除阻塞 -> SIGCHLD被递送 -> 被忽略
- system() -> SIGCHLD生成 -> 被阻塞 -> 解除阻塞 -> 被忽略 -> 未被递送
解答
正确的流程是流程1。
信号的“忽略”属于信号递送阶段的处理动作:当system()阻塞SIGCHLD时,若该信号生成,会进入未决(pending)状态暂存;当system()解除对SIGCHLD的阻塞后,内核会触发信号递送流程,此时如果进程对SIGCHLD的处理动作被设置为忽略,信号会在递送完成后直接被丢弃,不会触发任何自定义处理逻辑。
流程2的逻辑不符合Unix/Linux信号处理的机制——不存在“先忽略信号再阻止递送”的情况,忽略是信号被递交给进程后的处理结果,而非预先阻止信号递送的操作。
内容的提问来源于stack exchange,提问作者Chintha Siva Prasad
相关产品推荐
相关产品推荐

