我有一个将输入参数作为PID的函数。 例如
bool KillProcessTree (int ParentPID)
{
}
现在我想编写上面函数的定义,它将首先获取所有子进程然后终止它们。
Unix中是否有任何API将采用父PID并返回父进程创建的子进程数?
答案 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)
发送到流程组中的所有流程。
您应该安排要杀死的所有进程属于同一进程组,并且对于您不希望杀死的进程不属于该进程组。使父进程调用setsid
或setpgid
,然后终止进程组。
答案 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);
}