我正在研究信号并通过此链接
https://en.wikipedia.org/wiki/Child_process#cite_note-1
这就是它所说的:“SIGCHLD 信号在子进程退出、中断或中断后恢复时被发送到父进程。默认情况下,该信号被简单地忽略”
我们有什么理由忽略 SIGCHLD。
我正在研究信号并通过此链接
https://en.wikipedia.org/wiki/Child_process#cite_note-1
这就是它所说的:“SIGCHLD 信号在子进程退出、中断或中断后恢复时被发送到父进程。默认情况下,该信号被简单地忽略”
我们有什么理由忽略 SIGCHLD。
尝试生孩子,您就会明白为什么有时您必须忽略SIGCHLD
以保持理智:)。
撇开玩笑不谈,这句话的意思是 POSIX 系统没有为 SIGCHLD 定义默认的信号行为,除了忽略它。将此与SIGINT
,SIGTERM
等进行比较,其中默认行为可能是终止进程。
man 7 signal
有关所有信号、所有默认处理程序以及信号->默认处理程序的映射的列表,请参见linux。
通常忽略 SIGCHLD 是有意义的,因为您可以从waitpid
.
即使我的回答迟到了,这对于一个思考需要的原因SIGCHLD
以及为什么它被忽略的人来说可能会有所帮助。来听听我的故事吧。
我参加了一个项目,其中我们正在流式传输在线广播电台,其扩展名是.pls
,.m3u
或者只是IP:Port
。每个电台对我们来说都是一个频道。有两个小玩意——电位器和旋转编码器——可以顺时针或逆时针旋转(切换)。前者用于调节收音机的音量,后者用于更换频道。我正在使用通过终端工作的媒体播放器,所以这也是另一个过程。同样,我正在使用amixer这也是另一个过程在无限循环内突然调整音量。在主进程中,我创建了两个进程。要更改频道,我选择发送 SIGKILL 信号来终止播放器进程,该进程可能会播放所选电台以进入新频道并wait()
进入父频道。wait()
在这里使用是合适的,因为我在等待之前已经杀了他。它会立即返回而不会阻塞。在音量转换器方面,它可以工作,直到无线电设备关闭。它的进程正在无限循环中运行。
那么,如果我选择让它的父进程等待音量调节器进程会发生什么?
主进程将永远阻塞,因为音量调节器进程永远不会返回。取而代之的是,我选择明确处理但忽略方式。为什么?因为我不在乎它何时终止或它的返回值是什么。我只关心它终止后,我不希望孩子变成僵尸。我只想在孩子退出时立即收获它以及非阻塞主进程。
为什么我们一般会忽略
SIGCHLD
?
如果(如上述示例中)信号处理程序除了调用之外什么都不做,waitpid
则可以使用替代方法。将SIGCHLD
处理程序设置为SIG_IGN
将导致僵尸进程被自动收割。
不要忘记这样做,需要sigaction()
使用处置显式调用SIG_IGN
。