我在Linux上有一个进程,通过fork启动了20个子进程。当我杀死父进程时,通常会杀死所有的子进程,但有时它不会杀死所有子进程,留下一些孤立进程。这不是启动时的竞态条件,而是在进程活动数分钟后出现的。
什么原因可能导致SIGTERM不能正确地传播到某些子进程?
在进程树中,没有自动传播信号(包括SIGTERM或其他信号)到子进程。
如果观察到杀死父进程会导致某些子进程退出,那么这是由于附属效应所致——例如,当子进程尝试读取或写入管道时,在另一端的父进程已经死亡,会导致SIGPIPE。
如果您想确保在进程接收到SIGTERM时清理子进程,请安装信号处理程序并自行完成。
ps a -o pgid,command
。