我希望主进程能够运行并创建4个子进程。一旦创建它们,我希望主进程等待它们完成。
这是我的全部代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){
int i;
int childID;
int status;
for (i=0;i<4;i++){
childID=fork();
if (childID==0){
printf("[%d] I the child, will sleep\n", (int)getpid());
sleep(1);
}
}
if (!childID){
wait(&status);
printf("[%d] I the parent, have waited for my children!\n", (int)getpid());
}
return 0;
}
我得到的是:
..
[8508] I the child, will sleep
[8503] I the parent, have waited for my children!
[8511] I the child, will sleep
[8510] I the child, will sleep
[8509] I the child, will sleep
[8520] I the child, will sleep
[8511] I the parent, have waited for my children!
[8510] I the parent, have waited for my children!
(prompt stuck)
为什么父母打印多次而不是一次打印?
答案 0 :(得分:3)
父母不是多次写作,而是前三个孩子。当你fork
时,孩子们会得到一个过程的精确副本,包括地址空间,堆栈,寄存器,一切。这意味着在第一个fork
之后,父母和新孩子将经历for
3次,再创建3个新孩子。作为孩子执行期望效果时,您应break
从for
开出:
if (childID==0){
printf("[%d] I the child, will sleep\n", (int)getpid());
sleep(1);
break;
}
答案 1 :(得分:1)
看看印刷品的pids。 8510和8511是孩子,而不是原来的父母。当您在循环中进行分叉时,子进程也处于该循环中。尝试在睡眠后放置break;
(1)。
答案 2 :(得分:0)
当你运行循环时,一旦你分叉,孩子在分叉后的第一次迭代中会睡觉,但随后会分叉更多的进程。由于childID
对于这些流程不再是0
,因此不会调用等待,因此他们不会收获他们的孩子。这意味着当所有等待调用完成后,您仍将运行进程,因此终端将挂起。