【问题标题】:What order are signals sent to a process group in Linux?Linux 中向进程组发送信号的顺序是什么?
【发布时间】:2016-03-23 17:45:21
【问题描述】:

如果我在终端 ctrl-c 一个程序,Linux 会发送一个 SIGTERM 给进程组的所有成员。每个进程接收信号的顺序是否明确?

例如:如果我有一个类似这样的进程树(

[PID 2] <-- [PID 3] <-- [PID 4]
                     \_ [PID 5]
                      |_[PID 6]

pids 4,5,6 会先收到信号,向 pid 3 发送 SIGCHLD 吗?然后是 pid 3 和 pid 2?

【问题讨论】:

  • 我可能错了,但我相信父母收到信号然后将其发送给孩子,以便他们关闭。或者父进程负责关闭所有子进程。
  • 信号肯定会发送给进程组的所有成员,默认情况下会包括任何 fork() 的子进程。父母需要在孩子身上等待()以避免创建僵尸,但我找不到任何关于孩子是否在父母之前或之后发出信号的文档。
  • 我突然想到,对于我的应用程序,这可能并不重要,因为我的孩子不受我控制,他们可以执行 setpgrp 或更改会话,所以我必须重新- 无论如何发出信号以确保安全。不过,知道答案会很有趣。
  • 把问题发到linuxquestions.org 也没什么坏处。
  • 我认为发送信号的顺序并不重要,因为它们只会坐在进程的待处理队列中,直到进程被调度。

标签: linux


【解决方案1】:

我一直在浏览 Linux 内核源代码,我想我有答案了。当通过 kill 发送信号时,Linux 会遍历 pid 结构中保存的链表,其中包含使用该 PID 的所有任务。我相信这意味着它会以 reverse 顺序迭代组中的进程,因为 PID 是使用 hlist_add_head_rcu 添加到链接列表中的,它插入它在头部。不过,我认为不应该依赖这种行为,因为他们可以通过多种方式对其进行更改。

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多