使用 fork 时 while(wait(NULL)){} 和 while(wait(NULL) > 0){} 有什么区别

Kam*_*Pop 2 c posix fork wait

我有以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

while(wait(NULL)){}
Run Code Online (Sandbox Code Playgroud)

while(wait(NULL) == 0){} 
Run Code Online (Sandbox Code Playgroud)

或者

while(wait(NULL) > 0){}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢您的帮助!

dbu*_*ush 5

当你这样做时:

while(wait(NULL)){} 
Run Code Online (Sandbox Code Playgroud)

它等同于:

while(wait(NULL) != 0){} 
Run Code Online (Sandbox Code Playgroud)

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

这样做:

while(wait(NULL) > 0){}
Run Code Online (Sandbox Code Playgroud)

只要子进程返回就会循环,返回 -1 时退出。