0

我正在研究信号并通过此链接

https://en.wikipedia.org/wiki/Child_process#cite_note-1

这就是它所说的:“SIGCHLD 信号在子进程退出、中断或中断后恢复时被发送到父进程。默认情况下,该信号被简单地忽略”

我们有什么理由忽略 SIGCHLD。

4

2 回答 2

5

尝试生孩子,您就会明白为什么有时您必须忽略SIGCHLD以保持理智:)。

撇开玩笑不谈,这句话的意思是 POSIX 系统没有为 SIGCHLD 定义默认的信号行为,除了忽略它。将此与SIGINT,SIGTERM等进行比较,其中默认行为可能是终止进程。

man 7 signal有关所有信号、所有默认处理程序以及信号->默认处理程序的映射的列表,请参见linux。

通常忽略 SIGCHLD 是有意义的,因为您可以从waitpid.

于 2015-09-17T14:15:29.877 回答
0

即使我的回答迟到了,这对于一个思考需要的原因SIGCHLD以及为什么它被忽略的人来说可能会有所帮助。来听听我的故事吧。

我参加了一个项目,其中我们正在流式传输在线广播电台,其扩展名是.pls.m3u或者只是IP:Port。每个电台对我们来说都是一个频道。有两个小玩意——电位器旋转编码器——可以顺时针或逆时针旋转(切换)。前者用于调节收音机的音量,后者用于更换频道。我正在使用通过终端工作的媒体播放器,所以这也是另一个过程。同样,我正在使用amixer这也是另一个过程在无限循环内突然调整音量。在主进程中,我创建了两个进程。要更改频道,我选择发送 SIGKILL 信号来终止播放器进程,该进程可能会播放所选电台以进入新频道并wait()进入父频道。wait()在这里使用是合适的,因为我在等待之前已经杀了他。它会立即返回而不会阻塞。在音量转换器方面,它可以工作,直到无线电设备关闭。它的进程正在无限循环中运行。

那么,如果我选择让它的父进程等待音量调节器进程会发生什么?

主进程将永远阻塞,因为音量调节器进程永远不会返回。取而代之的是,我选择明确处理但忽略方式。为什么?因为我不在乎它何时终止或它的返回值是什么。我只关心它终止后,我不希望孩子变成僵尸。我只想在孩子退出时立即收获它以及非阻塞主进程。

为什么我们一般会忽略SIGCHLD

如果(如上述示例中)信号处理程序除了调用之外什么都不做,waitpid则可以使用替代方法。将SIGCHLD处理程序设置为SIG_IGN将导致僵尸进程被自动收割。

不要忘记这样做,需要sigaction()使用处置显式调用SIG_IGN

于 2018-07-20T18:36:09.100 回答