当父母被杀时,杀死所有子进程

时间:2015-06-16 13:31:04

标签: c++ linux process

我在LINUX下运行C ++程序 从我的程序代码中,我通过while IFS='' read -r line; do expr ${line//,/ + } done 电话呼叫另一个程序:

system()

但此system("calledProgram opt1 opt2 ... opt_n"); 运行多个流程(具有特定名称,例如calledProgramp1p2p3)。

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

这里(How to kill process in c++, knowing only part of its name)描述了如何查找具有特定名称的进程并将其终止 但是如果用户使用来自不同目录的相同选项运行程序会怎样。我是否应该检查正在运行的目录以找到正确的进程?

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

PS:当我从cmd行运行p4,然后通过ctrl + c查杀它时,其进程不会自动被杀死。

2 个答案:

答案 0 :(得分:3)

我建议您使用fork / exec而不是system()来调用您的新程序。这很简单。请this

您的应用程序似乎有必要,因为您需要“calledProgram”才能成为您程序的孩子,所以当有人杀死您的程序时它会死亡。

您还需要处理SIGINT信号。用最简单的方法你需要这样的东西:

#include<signal.h>

void signal_handler() 
{
    kill(0,SIGTERM);
}

int main() 
{    
    signal(SIGINT,signal_handler);  
}

答案 1 :(得分:2)

杀死进程时,所有子进程都被终止。 这对于未分离的子进程是正确的。

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

如果您将所有子进程放在同一进程组中,则可以使用单个kill(2)调用终止所有进程。

参见:man 2 kill