你可以打电话
int st = waitpid(-1, NULL, WNOHANG);
第一个参数告诉waitpid()
您等待所有子进程退出,而不是等待特定的pid。
第三个参数是一个标志,它使waitpid()
立即返回而不是阻塞。
现在有三种可能的结果:
-1
和errno
is ECHILD
:这意味着根本没有子进程存在>0
:这表示一个孩子过去已经退出,但尚未收集返回值(所谓的僵尸进程)。现在重复该过程(waitpid()
再次调用)。0
:在这种情况下,仍有一些子进程仍在运行。这应涵盖您要求的所有情况。
通过AFAICT,学生只需创建自己的过程,便可以创建使用该方法不会等待
fork()
的过程。@EOF主要问题是:_是否可以在不知道所创建子进程的线程ID的情况下检查当前进程是否没有任何子进程?_,我认为在此对此进行了广泛回答
但是,如果您实际阅读了该问题,则很明显,这对于所述问题将不起作用。
@EOF不,我认为您误会了OP
也许,但是引用:“因为我没有打电话给fork [...]”表示学生正在打电话
fork()
。似乎很难想象学生正在打电话fork()
但不能打电话fork()
给孩子的情况。如果问题的既定目标是“检查学生创建的所有子过程是否都已退出”,则只有对问题的非常狭understanding的理解才能使其成为一个很好的答案。