我有一个函数,它的输入参数是进程ID(PID)。
例如:bool KillProcessTree (int ParentPID)
{
}
现在我想写上面函数的定义,它首先会获取所有子进程然后杀死它们。
Unix中是否有任何API可以使用父进程PID并返回父进程创建的子进程数量?
没有标准的Unix API可以检索给定进程的子进程列表。
您可以列出系统上所有进程及其父进程,并从中构建进程树。这样做的可移植方式是运行以下命令:
ps -e -o ppid= -o pid=
并解析输出(popen
和scanf("%ld %ld\n")
的循环将起作用)。将数据存储为从PPID到PID的有限映射,然后遍历树以收集您感兴趣的进程的后代列表。
如果任何一个进程在处理过程中分叉或退出,则可能会错过它。如果运气不好,进程可能会退出,并且其PID可能在您执行所有此操作时得到重用。此外,如果进程P分叉出子进程Q,Q再分叉出孙子R,然后Q退出,R的PPID将设置为1,因此您将无法检测到R最初是P的后代。
简而言之:无论您的问题是什么,这很可能是错误的方法。
Unix具有处理此问题的功能:进程组。很可能进程组是您试图解决问题的答案。您可以使用kill(-pgid,signal_number)
原子地向进程组中的所有进程发送信号signal_number
。
您应该安排所有要杀死的进程属于同一进程组,并且不希望杀死的进程不属于该进程组。使父进程调用setsid
或setpgid
,然后杀死该进程组。
signum
。它只是 "signal number"的简写,还是一些我在 man signal.h
中找不到的花哨信号? - lindhepid_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);
}
killpg
系统调用可能会很有用。或者,使用kill
,并设置pid = -1
。 - Brett Hale