我在C中编写了一个程序。我在主进程中执行fork(),以便在forked子进程中执行execve()来执行未知应用程序(由命令行中的用户给出)。我知道执行应用程序的进程的PID - 它由fork()返回,但是这个未知的应用程序可能多次fork()并且我不知道它的所有子进程的PID(它们是主要父进程的孙子) )。如何检查主要流程 WHEN 其子流程(它是未知应用)和未知应用退出的所有子项? (我甚至不知道它有多少孩子,我不知道这些孩子的PID)。
答案 0 :(得分:3)
这可以通过使您的父进程成为subreaper来完成。 subreaper通过其后代获取孤儿的所有子项,传统上它们总是转到init(进程ID 1)。在分叉有趣的子进程之前,需要启用subreaper状态。完成此操作后,对任何进程的waitpid()
或类似调用将返回子进程和所有孤立的后代,直到整个树都消失后返回错误[ECHILD]
。
在Linux上,使用prctl()
PR_SET_CHILD_SUBREAPER
选项启用此功能,在FreeBSD上使用procctl()
PROC_REAP_ACQUIRE
命令启用此功能(有关详细信息,请参阅手册页) )。
在Linux上,您将能够以这种方式单独监视一个子进程,因为孤儿不记得他们来自哪个原始fork调用。在FreeBSD上,PROC_REAP_GETPIDS
允许区分单个子树,但如果树包含许多进程,则效率较低。
答案 1 :(得分:-1)
您可以使用waitpid(-1,NULL,WNOHANG)来判断一个孩子是否已退出。如果您收到一个正数(一个pid),那么一个孩子已退出。在父进程中,您有一行检查您拥有的子进程数量(此处称为x)是否大于0.如果使用此命令查看是否有任何子进程已结束。如果你有x个项目,那么当你添加一个项目增量x和一个退出减量x时。当你所拥有的孩子数量为x时,所有孩子都被杀死了。