为什么我们通常忽略SIGCHLD
Why we generally ignore SIGCHLD
我正在研究信号并通过这个link
https://en.wikipedia.org/wiki/Child_process#cite_note-1
这就是它所说的:"The SIGCHLD signal is sent to the parent of a child process when it exits, is interrupted, or resumes after being interrupted. By default the signal is simply ignored"
我们忽略 SIGCHLD 有什么原因吗?
试着生孩子,你就会明白为什么有时你不得不忽视 SIGCHLD
来保持理智:)。
开个玩笑,这句话的意思是 POSIX 系统没有为 SIGCHLD 定义默认信号行为,除了忽略它。将其与 SIGINT
、SIGTERM
等进行比较,其中默认行为可能是终止进程。
有关所有信号、所有默认处理程序以及信号->默认处理程序的映射的列表,请参阅 linux 上的 man 7 signal
。
通常忽略 SIGCHLD 是有意义的,因为您可以从 waitpid
中知道您需要知道的一切。
虽然我的回答晚了,但对于想知道 SIGCHLD
需要的原因以及为什么它被忽略的思考者来说,这可能会有所帮助。来听听我的故事吧。
我参加了一个项目,在该项目中我们正在播放扩展名为 .pls
、.m3u
或只是 IP:Port
的在线广播电台。每个电台都是我们的频道。有两个小玩意儿 - 一个 potentiometer and a rotary encoder - which are able to be rotated(switched) either clockwise or counter clockwise. The former is used to adjust volume of the radio, likewise the latter is to change channels. I'm using a media player working via terminal, so it is also another process. Likewise, I'm using amixer 也是 另一个过程 在无限循环中突然调整音量。在主进程中,我创建了两个进程。要更改频道,我选择发送 SIGKILL 信号以终止播放器进程,该进程可能会播放所选电台以进入新频道和 wait()
in parent。 wait()
在这里使用是合适的,因为我在等待之前已经杀了他。它会立即 returns 而不会阻塞。在音量转换器方面,它一直工作到无线电设备关闭为止。它的进程正在运行 无限循环。
So, what would be happen if I opt to make wait its parent process for the volume adjuster process?
主进程将永远阻塞,因为音量调节器进程永远不会 return。相反,我选择显式处理但忽略方式。 为什么? 因为我不关心它何时终止或它的 return 值是多少。我只关心它终止后,我不希望child变成僵尸。我只想在 child 退出时立即收割它以及 non-blocking 主进程。
Why do we generally ignore SIGCHLD
?
如果(如上述示例所示)信号处理程序除了调用 waitpid
之外什么都不做,则可以使用替代方法。将 SIGCHLD
处理程序设置为 SIG_IGN
将导致自动收割僵尸进程。
别忘了要做到这一点,需要明确调用 sigaction()
并配置 SIG_IGN
。
我正在研究信号并通过这个link
https://en.wikipedia.org/wiki/Child_process#cite_note-1
这就是它所说的:"The SIGCHLD signal is sent to the parent of a child process when it exits, is interrupted, or resumes after being interrupted. By default the signal is simply ignored"
我们忽略 SIGCHLD 有什么原因吗?
试着生孩子,你就会明白为什么有时你不得不忽视 SIGCHLD
来保持理智:)。
开个玩笑,这句话的意思是 POSIX 系统没有为 SIGCHLD 定义默认信号行为,除了忽略它。将其与 SIGINT
、SIGTERM
等进行比较,其中默认行为可能是终止进程。
有关所有信号、所有默认处理程序以及信号->默认处理程序的映射的列表,请参阅 linux 上的 man 7 signal
。
通常忽略 SIGCHLD 是有意义的,因为您可以从 waitpid
中知道您需要知道的一切。
虽然我的回答晚了,但对于想知道 SIGCHLD
需要的原因以及为什么它被忽略的思考者来说,这可能会有所帮助。来听听我的故事吧。
我参加了一个项目,在该项目中我们正在播放扩展名为 .pls
、.m3u
或只是 IP:Port
的在线广播电台。每个电台都是我们的频道。有两个小玩意儿 - 一个 potentiometer and a rotary encoder - which are able to be rotated(switched) either clockwise or counter clockwise. The former is used to adjust volume of the radio, likewise the latter is to change channels. I'm using a media player working via terminal, so it is also another process. Likewise, I'm using amixer 也是 另一个过程 在无限循环中突然调整音量。在主进程中,我创建了两个进程。要更改频道,我选择发送 SIGKILL 信号以终止播放器进程,该进程可能会播放所选电台以进入新频道和 wait()
in parent。 wait()
在这里使用是合适的,因为我在等待之前已经杀了他。它会立即 returns 而不会阻塞。在音量转换器方面,它一直工作到无线电设备关闭为止。它的进程正在运行 无限循环。
So, what would be happen if I opt to make wait its parent process for the volume adjuster process?
主进程将永远阻塞,因为音量调节器进程永远不会 return。相反,我选择显式处理但忽略方式。 为什么? 因为我不关心它何时终止或它的 return 值是多少。我只关心它终止后,我不希望child变成僵尸。我只想在 child 退出时立即收割它以及 non-blocking 主进程。
Why do we generally ignore
SIGCHLD
?
如果(如上述示例所示)信号处理程序除了调用 waitpid
之外什么都不做,则可以使用替代方法。将 SIGCHLD
处理程序设置为 SIG_IGN
将导致自动收割僵尸进程。
别忘了要做到这一点,需要明确调用 sigaction()
并配置 SIG_IGN
。