wait()不等待每个孩子

问题描述:

我有一个循环创建'n'子进程。进程进入一个单独的程序,睡眠'x'秒,然后返回退出状态'x'。问题是当我尝试等待每个单独的进程时。看起来,我的wait()调用等待最后一个进程,然后程序退出。我希望这样,以便哪个孩子退出,我可以打印他们的信息,然后等待下一个孩子退出并打印他们的信息......等等。wait()不等待每个孩子

代码:

int main() 
{ 
     char input[12]; 
     int n, i, ch; 
     pid_t pid; 
     int status={0}; 

     printf("Enter an integer: "); 
     fgets(input, 12, stdin); 
     if (input[10] == '\n' && input[11] == '\0') { while ((ch = fgetc(stdin)) != EOF && ch != '\n'); } 
     rmnewline(input); 

     n = atoi(input); 

     for(i=0; i<=n-1; i++) 
     { 
     pid = fork(); 
     if(pid == 0) 
     execl("/home/andrew/USP_ASG2/sleep", "sleep", NULL); 
     } 

     for(i=0; i<=n-1; i++) 
     { 
     wait(&status); 
     if(WIFEXITED(status)) 
     { 
      int exitstat = WEXITSTATUS(status); 
      printf("Child %d is dead with exit status %d\n", pid, exitstat); 
     } 
     } 
} 

输出:

In child 15930 
In child 15929 
In child 15928 
Child 15930 is dead with exit status 5 
Child 15930 is dead with exit status 5 
Child 15930 is dead with exit status 5 
+0

除此之外:作为一种风格,'i

+0

@WeatherVane No.对于基于零的数组偏移,'for(i = 0; i

+1

@AndrewHenle你确定你看过我的评论corerctly?如果'n == 0',循环控制'i

你忘了捕捉wait()的返回值,所以pid仍然包含您分叉了最后进程的PID。

这样做:

pid = wait(&status); 

,你会得到预期的输出。

+0

谢谢你清理那个!尽管所有的孩子仍然在同一时间以同样的“随机”退出状态退出。编辑:我目前正在改变随机数的种子如何生成,因为这可能是问题。 –

+1

@AndrewRicci当你fork()时,子进程独立于父进程和任何其他子进程运行。它们都是由操作系统分开安排的,所以你无法控制每一个结束的时间而不使用管道,信号或共享内存互斥。退出值完全取决于子进程。 – dbush

+0

他们执行的程序用'srand(time(NULL))生成一个随机数;''然后在0到9之间随机选择一个时间。它不能控制它,只是它们都应该在不同的时间退出。 –