在UNIX中杀死父进程的所有子进程的C / C ++程序?

时间:2014-02-06 12:14:20

标签: c unix process

我有一个将输入参数作为PID的函数。 例如

bool KillProcessTree (int ParentPID)
{

}

现在我想编写上面函数的定义,它将首先获取所有子进程然后终止它们。

Unix中是否有任何API将采用父PID并返回父进程创建的子进程数?

2 个答案:

答案 0 :(得分:3)

没有标准的Unix API来检索给定进程的子进程列表。

您可以使用其父进程列出系统上的所有进程,并从中构建进程树。可行的方法是运行命令

ps -e -o ppid= -o pid=

并解析输出(popen后跟scanf("%ld %ld\n")循环将会执行)。将数据存储为从PPID到PID的有限映射,然后遍历树以收集您感兴趣的进程的后代列表。

如果在处理过程中有任何相关的进程出现问题或退出,您可能会错过它。如果你运气不好,一个过程可能会退出,并且当你做这一切时它的PID可能会重复使用。此外,如果进程P分叉子进程Q,它会分叉孙子R,然后Q退出,则R的PPID将被设置为1,因此您将不会检测到R最初是P的后代。

简而言之:无论你遇到什么问题,这都可能是错误的做法。

Unix有一个处理这个问题的功能:process groups。过程组很有可能是您要解决的问题的答案。您可以使用signal_number以原子方式将信号kill(-pgid, signal_number)发送到流程组中的所有流程。

您应该安排要杀死的所有进程属于同一进程组,并且对于您不希望杀死的进程不属于该进程组。使父进程调用setsidsetpgid,然后终止进程组。

答案 1 :(得分:0)

我只是在fork()的父进程中的pid_t数组中存储所有子pids。

之后,通过循环该数组来杀死所有。

pid_t all_child[10]; // you should not define a fixed length array, you can use pointer.
if((pid = fork()) == 0)
{
     //child processes
}
else
{
//parent process
all_pid[counter] = pid;
}

杀人时,

for( i = 0; i < counter; i++)
{
kill(all_pid[i], SIGTERM);
}
相关问题