我想制作两个平行的工作叉,最后等待它们完成。
for (int i = 0; i < 2; i++) {
pid_t pid = fork();
if(pid < 0) {
fprintf(stderr,"Cannot fork!");
exit(EXIT_FAILURE);
}
else if(pid == 0) {
switch(i)
{
case 0:
//first child
exit(EXIT_SUCCESS);
break;
case 1:
//second child
exit(EXIT_SUCCESS);
break;
}
break;
}
else {
//parent
}
}
问题是主程序在子程序之前终止。如果我将wait(0)添加到else父级部分,它会等待每个进程,因此它们不会同时工作,而是一个接一个地工作。 我假设我可以简单地在循环之后放置wait()或waitpid(),但这也不起作用。我认为在fork之后父进程正常继续,所以当wait()在循环和if-else结构之外时为什么不等待?
抱歉打扰并提前致谢。
答案 0 :(得分:1)
如果在else父部分中添加wait(NULL)
,则父进程确实会等待第一个子进程在创建第二个子进程之前返回。
如果您在循环后添加wait(NULL)
,则父流程将等待仅,以便返回第一个子流程。
如果您希望所有子进程同时运行,则需要第二个循环,其中父进程将根据需要多次使用wait()
来收集每个的退出状态子进程。
在您的情况下,有2个子进程,因此2个wait()
系统调用就足够了。要添加的循环是这样的(我还添加了printf
,以便您可以在stdout
上观察它:
for (i = 0; i < 2; i++) {
wait(NULL);
printf("My child No %d died.\n", i);
}