SIGTERM信号无法传递给子进程的原因是什么?

8

我在Linux上有一个进程,通过fork启动了20个子进程。当我杀死父进程时,通常会杀死所有的子进程,但有时它不会杀死所有子进程,留下一些孤立进程。这不是启动时的竞态条件,而是在进程活动数分钟后出现的。

什么原因可能导致SIGTERM不能正确地传播到某些子进程?


谢谢。这解决了我一直以来的很多困惑,我以为子进程会自动终止,所以感到混淆不清。 - steve8918
2个回答

9

在进程树中,没有自动传播信号(包括SIGTERM或其他信号)到子进程。

如果观察到杀死父进程会导致某些子进程退出,那么这是由于附属效应所致——例如,当子进程尝试读取或写入管道时,在另一端的父进程已经死亡,会导致SIGPIPE。

如果您想确保在进程接收到SIGTERM时清理子进程,请安装信号处理程序并自行完成。


顺便提一下,内核会向所有具有控制终端的进程发送SIGKILL和SIGINT信号。此外,发送给一组进程的信号将被发送到多个进程(SIGHUP将被发送到会话所有者的进程组)。 - Luis Colorado

4
如果在发送信号时使用进程组ID(pgid),则该信号将传播到父进程及其所有子进程。
要了解pgid,请使用ps a -o pgid,command

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接