杀死父进程时终止所有子进程

Kill all the child processes when parent is killed

本文关键字:子进程 终止 进程      更新时间:2023-10-16

我在LINUX下运行一个C++程序。
从我的程序代码中,我正在调用另一个程序,system()调用:

system("calledProgram opt1 opt2 ... opt_n");

但是这个calledProgram运行多个进程(具有特定名称,例如p1p2p3p4)。

当我的程序被用户外部杀死时,如何找到并终止这些进程。

这里(如何在 c++ 中杀死进程,只知道其名称的一部分)描述了如何查找具有特定名称的进程并杀死它们。
但是,如果用户使用来自不同目录的相同选项运行程序怎么办。我是否也应该检查正在运行的目录以找到正确的进程?

有没有另一种(更好的)方法来杀死这些子进程?

PS:当我从cmd行运行calledProgram,然后通过ctrl + c杀死它时,它的进程不会自动终止。

我建议你使用fork/exec而不是system()来调用你的新程序。这很容易。看到这里。

对于您的应用程序来说,这似乎是必要的,因为您需要"calledProgram"作为程序的子级,因此当有人杀死您的程序时它会死亡。

您还需要处理 SIGINT 信号。以最简单的方式,您需要这样的东西:

#include<signal.h>
void signal_handler() 
{
    kill(0,SIGTERM);
}
int main() 
{    
    signal(SIGINT,signal_handler);  
}

终止进程时,将杀死所有子进程。对于尚未分离的子进程,情况也是如此。

你的进程只需要记住它最近的孩子的pid并杀死他们。子进程将自动死亡。

如果将所有子进程放在同一个进程组中,则只需一次 kill(2) 调用即可终止所有子进程。

详见:人2杀