首页 > 解决方案 > 使用 fork 时 while(wait(NULL)){} 和 while(wait(NULL) > 0){} 有什么区别

问题描述

我有以下代码:

#include<stdio.h>
#include<stdlib.h> 
#include<sys/wait.h> 
#include<unistd.h> 

int main() {
for(int i = 0; i <3; i++){
    fork();
}
while(wait(NULL)){}
printf("Text\n");
return 0;
}

当我尝试执行它时,我SIGKILL从 fork 调用中收到一个错误,而不是收到 8 条短信。但是,如果我改变

while(wait(NULL)){}

while(wait(NULL) == 0){} 

或者

while(wait(NULL) > 0){}

我按预期收到了 8 个“文本”打印件。

为什么程序在第一种情况下不起作用?wait(NULL)循环或循环不wait(0)应该等到所有子进程完成执行吗?

谢谢您的帮助!

标签: cforkposixwait

解决方案


当你这样做时:

while(wait(NULL)){} 

它与以下内容相同:

while(wait(NULL) != 0){} 

wait函数在成功时返回子 pid,在错误时返回 -1。所以返回值永远不会是 0。这会导致无限循环。

这样做:

while(wait(NULL) > 0){}

只要有孩子返回就会循环,并在返回 -1 时退出。


推荐阅读