我正在用C编写一个多进程程序。
我希望父进程可以等待所有子进程完成然后退出 它接收SIGINT。
我有两个问题。
父母如何记录分叉的子进程的每个pid。 在录制功能运行之前,子进程可能会完成 主要过程。
如果父母不知道它有多少子进程。他怎么能等 所有子进程完成。
提前致谢。
答案 0 :(得分:1)
您在分叉子进程时记录子进程的pid(如果需要)。
在pid = 0的循环中调用waitpid
,它将返回退出的进程的pid或返回-1,如果errno = ECHILD
则没有剩余的奴隶。
答案 1 :(得分:0)
继续在循环中调用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");
}