我有以下代码:
#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)应该等到所有子进程执行完毕吗?
谢谢您的帮助!
当你这样做时:
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 时退出。