我在SO和Google上查了这个问题,几乎每次有人问这个问题时,答案似乎都是“不”,你必须竭尽全力确保孩子与父母终止关系。然而,这不是我的经验,至少不是在 WSL 2 下运行的 Ubuntu 中。当我使用
SIGINT
(按 Ctrl-C)终止我的父进程时,默认情况下,我派生的所有子进程都会消失.
我发现一些可能证实这一点的信息的地方是这里,其中指出:
当我们调用 fork() 时,它会创建一个具有唯一的子进程 进程 ID 和来自其父进程的信号处理副本 过程。然而,当我们调用 exec() 系列方法时,它 替换过程映像并将信号配置重置为 默认。
这意味着 exec() 之后子进程中的信号行为不再与父进程共享。 因此,如果我们在调用后向父进程发送信号 exec(),自然不会传播。
除非我误解了这一点,否则似乎是在说子进程不会随其父进程终止的想法只有在您在
exec
之后调用 fork
时才是正确的,而我不是。
那么,这是正确的解释吗?
当我使用 SIGINT(按 Ctrl-C)终止父进程时, 默认情况下,我分叉的所有子进程都会消失。
发生这种情况是因为两个进程都在同一个进程组中,并且您杀死了组长,请参阅SIGINT和子进程。
您引用的内容看起来像 Baeldung 教程。第一部分:
当我们调用 fork() 时,它会创建一个具有唯一的子进程 进程 ID 和来自其父进程的信号处理副本 过程。然而,当我们调用 exec() 系列方法时,它 替换过程映像并将信号配置重置为 默认。
仅意味着当您使用
exec
恢复代码时,自然无法保留自定义信号处理程序。事实是,只有自定义信号处理程序被重置为默认值(请参阅信号处理程序在“exec”之后是否有可能继续存在?)。
这意味着子进程中exec()之后的信号行为 不再与父进程共享。因此,如果 我们在调用 exec() 后向父进程发送信号,它会 自然不会传播。
最后这几句话有点奇怪。第一个仅意味着(如果我理解得很好)每个进程都有自己的信号管理。第二个是错误的/误导性的。没有传播,这是事实,因为根本没有信号传播。但正如我已经说过的,有一个进程组的概念可能会影响进程的生存方式。