【问题标题】:Why we generally ignore SIGCHLD为什么我们通常忽略 SIGCHLD
【发布时间】:2015-12-14 09:44:06
【问题描述】:

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

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

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

我们有什么理由忽略 SIGCHLD。

【问题讨论】:

  • 可能的答案太多,或者对于这种格式来说,好的答案太长了。请添加详细信息以缩小答案范围或隔离可以在几段中回答的问题。

标签: c signals sigchld


【解决方案1】:

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

除了玩笑之外,这句话的全部意思是 POSIX 系统没有为 SIGCHLD 定义默认的信号行为,除了忽略它。将此与SIGINTSIGTERM 等进行比较,默认行为可能是终止进程。

请参阅 linux 上的man 7 signal 以获取所有信号、所有默认处理程序以及信号->默认处理程序的映射的列表。

通常忽略 SIGCHLD 是有意义的,因为您可以通过waitpid 了解您需要了解的所有内容。

【讨论】:

  • 呵呵呵呵,开个玩笑,反正你澄清了我的疑惑..谢谢。
【解决方案2】:

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

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

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

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

为什么我们通常会忽略SIGCHLD

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

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

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 2018-09-07
    • 2020-06-18
    • 1970-01-01
    • 2021-09-27
    • 2016-03-18
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多