【发布时间】:2011-09-25 13:51:44
【问题描述】:
我正在用 C 编写一个多进程程序。
我希望父进程可以等待所有子进程完成然后退出 它接收 SIGINT。
我有两个问题。
父母如何记录它派生的子进程的每个 pid。 子进程可能在录制功能运行之前完成 主要流程。
如果父母不知道它有多少子进程。他怎么能等 所有子进程完成。
提前致谢。
【问题讨论】:
我正在用 C 编写一个多进程程序。
我希望父进程可以等待所有子进程完成然后退出 它接收 SIGINT。
我有两个问题。
父母如何记录它派生的子进程的每个 pid。 子进程可能在录制功能运行之前完成 主要流程。
如果父母不知道它有多少子进程。他怎么能等 所有子进程完成。
提前致谢。
【问题讨论】:
您在 fork 子进程时记录它们的 pid(如果需要)。
在 pid = 0 的循环中调用 waitpid 它将返回一个已退出进程的 pid 或返回 -1,如果 errno = ECHILD 你没有任何从站。
【讨论】:
继续循环调用wait(2)。每次 wait() 返回时,您都会返回退出子进程的 PID 及其状态。状态会告诉您,它是正常退出(带有退出代码)还是由于信号。像这样的东西(未测试):
#include <sys/types.h>
#include <sys/wait.h>
...
pid_t pid;
int status;
...
while ((pid = wait(&status)) > 0) {
printf("Child %lu ", (unsigned long)pid);
if (WIFEXITED(status))
printf("exited with status %d\n", WEXITSTATUS(status));
else if (WIFSIGNALED(status))
printf("killed by signal %d\n", WTERMSIG(status));
else if (WIFSTOPPED(status))
printf("stopped by signal %d\n", WSTOPSIG(status));
else if (WIFCONTINUED(status))
printf("resumed\n");
else
warnx("wait(2) returned for no discernible reason");
}
【讨论】: