如何检查所有子进程是否结束?
How to check if all child processes ended?
我正在尝试创建一个作业,我想在其中检查学生创建的所有子进程是否已退出。因为我没有调用 fork,所以我无权访问线程 ID。有没有办法在不知道创建的子进程的线程 ID 的情况下检查当前进程是否没有任何子进程?
我检查了很多问题,但每个解决方案都包含使用来自 fork 调用的 return 值。感谢您的帮助。
谢谢。
您可以拨打
int st = waitpid(-1, NULL, WNOHANG);
第一个参数告诉 waitpid()
等待任何 child 进程退出,而不是特定的 pid。
第三个参数是一个标志,它使 waitpid()
return 立即而不是阻塞。
现在有三种可能的结果:
- return 值为
-1
而 errno
为 ECHILD
:这意味着根本没有 child 进程存在
- return值为
>0
:这表示,child过去已经退出,但return值尚未收集(so-called 僵尸进程)。现在迭代该过程(再次调用 waitpid()
)。
- return 值为
0
:在这种情况下,有 child 个可用进程仍然 运行。
这应该涵盖您要求的所有情况。
我正在尝试创建一个作业,我想在其中检查学生创建的所有子进程是否已退出。因为我没有调用 fork,所以我无权访问线程 ID。有没有办法在不知道创建的子进程的线程 ID 的情况下检查当前进程是否没有任何子进程?
我检查了很多问题,但每个解决方案都包含使用来自 fork 调用的 return 值。感谢您的帮助。
谢谢。
您可以拨打
int st = waitpid(-1, NULL, WNOHANG);
第一个参数告诉 waitpid()
等待任何 child 进程退出,而不是特定的 pid。
第三个参数是一个标志,它使 waitpid()
return 立即而不是阻塞。
现在有三种可能的结果:
- return 值为
-1
而errno
为ECHILD
:这意味着根本没有 child 进程存在 - return值为
>0
:这表示,child过去已经退出,但return值尚未收集(so-called 僵尸进程)。现在迭代该过程(再次调用waitpid()
)。 - return 值为
0
:在这种情况下,有 child 个可用进程仍然 运行。
这应该涵盖您要求的所有情况。