2017-03-17 68 views
0

我用C编写了一个程序。为了在分叉的子进程中执行execve()来执行未知的应用程序(由用户在命令行中给出),我在主进程中执行了fork()。我知道执行应用程序的进程的PID - 它由fork()返回,但是这个未知的应用程序可能多次fork(),我不知道所有子进程的PID(它们是主父进程的孙子)。我该如何检查主父进程何时其子进程(它是未知应用)和全部未知应用退出的子进程? (我甚至不知道它有多少孩子,我不知道这些孩子的PID)。如何检查Linux进程及其所有子进程何时退出?

+1

可能重复[如何从父进程获取子进程](http://stackoverflow.com/questions/17743879/how-to-get-child-process-from-parent-process) – klutt

+0

我很漂亮确定你不能以正常的方式做到这一点。也许涉及'ptrace'的东西? – melpomene

+0

应用程序应照顾其子女。你不应该担心他们。 – PSkocik

回答

3

这可以通过使您的父进程是一个子派生器来完成。一个subreaper可以让所有的孩子成为其后代的孤儿,而这些传统上总是会进入init(进程ID 1)。在派生有趣的子进程之前,需要启用子派生器状态。完成此操作后,任何进程的waitpid()或类似调用都会返回子进程和所有孤儿后代,直到整个树消失时返回错误[ECHILD]

在Linux上,这是使用prctl()PR_SET_CHILD_SUBREAPER选项启用,而在FreeBSD这是使用procctl()PROC_REAP_ACQUIRE命令(详见手册页)启用。

在Linux上,您将能够以这种方式单独监视一个子进程,因为孤儿不记得它们来自哪个原始分叉调用。在FreeBSD上,PROC_REAP_GETPIDS允许区分各个子树,但如果树包含许多进程,则效率较低。

+0

谢谢@jilles!这似乎是我正在寻找的。我会尝试。 顺便说一句:这个解释也是有用的:http://unix.stackexchange.com/questions/250153/what-is-a-subreaper-process – dluki

+0

这是它 - 伟大的工程 - 谢谢! :-) – dluki

-1

您可以使用waitpid(-1,NULL,WNOHANG)来判断是否有一个孩子已经退出。如果你收到一个正数(一个PID),那么一个孩子已经退出。在你的父进程中,你有一行检查你的子进程的数量(这里叫做x)是否大于0.如果它使用这个命令来查看是否有任何子进程已经结束。如果你有x个项目,那么当你添加一个项目增量x,当一个退出时减少x。当你所有孩子的数量x为零时,你所有的孩子都被杀死了。

+0

问题是关于孙子,而不是主要过程的子女。 – melpomene

+0

@melpomene没错。 – dluki

+0

@Charles我想知道什么时候使用execve()(所以我的孙子孙)退出的未知应用程序的所有孩子。我甚至不知道这个未知应用可以拥有多少个孩子,我不知道这些孩子的PID。 – dluki

相关问题