【问题标题】:C/C++ program to kill all child processes of a parent process in UNIX?C/C++程序杀死UNIX中父进程的所有子进程?
【发布时间】:2014-02-06 12:14:20
【问题描述】:

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

bool KillProcessTree (int ParentPID)
{

}

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

在 Unix 中是否有任何 API 可以获取父 PID 并返回父进程创建的子进程的数量?

【问题讨论】:

  • 对于 Linux,killpg 系统调用可能很有用。或者,kill 与:pid = -1
  • @BrettHale 确实有用,但父子关系与进程组关系有很大不同。
  • 会kill(ParentPID, SIGKILL),杀死任何父进程的所有子进程吗? SIKILL 的定义如下。 SIGKILL - 最强大的终止信号,它立即结束进程并且不能被程序阻塞或处理。
  • @user3253461 信号的选择与进程的选择无关。 KILL 杀死一个进程并且无法处理或阻止,但您仍在杀死该进程,而不是任何其他进程。

标签: c unix process


【解决方案1】:

没有标准的 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 有一个特性来处理这个问题:process groups。进程组很有可能是您试图解决的问题的答案。您可以使用kill(-pgid, signal_number)自动向进程组中的所有进程发送信号signal_number

你应该安排所有你想杀死的进程属于同一个进程组,而你不想杀死的进程不属于那个进程组。让父进程调用setsidsetpgid,然后杀死进程组。

【讨论】:

  • 谢谢,这是一个非常有用的答案,但是使用 popen() 和 cmd "ps -e -o ppid= -o pid=" 我也可以获取所有子进程和大子进程吗?
  • @user3253461 你得到了系统上的所有进程,你需要过滤那个列表来提取你想要的。
  • 我不熟悉signum。只是“signal number”的简写,还是我在 man signal.h 中找不到的一些奇特信号?
  • @lindhe 只是“信号编号”的简写。
【解决方案2】:

我会在 fork() 时将所有子 pid 简单地存储在父进程中的 pid_t 数组中。

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

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);
}

【讨论】:

  • 仅当您的代码作为父进程运行时才有效。该问题不包括该假设。
  • @WGH 我当然同意你的观点,如果从父母那里杀死所有孩子,我会回答。但我不确定是否有一个函数可以通过提供父 pid 来收集所有子进程 pid。我很高兴听到这个消息。
  • 没有。您可以遍历依赖于操作系统的表(例如 Linux 上的 procfs)来查找子表,但同样,这不是可移植的,并且可能会受到竞争条件的影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多