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

标签 c fork posix 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;
}

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

while(wait(NULL)){}

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

while(wait(NULL) > 0){}

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

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

感谢您的帮助!

最佳答案

当你这样做时:

while(wait(NULL)){} 

这等同于:

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

wait 函数在成功时返回子 pid,在出错时返回 -1。因此返回值永远不会为 0。这将导致无限循环。

这样做:

while(wait(NULL) > 0){}

只要有 child 返回就会循环,返回-1时退出。

关于c - 使用 fork 时 while(wait(NULL)){} 和 while(wait(NULL) > 0){} 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62665905/

相关文章:

c - 汇编代码泛化

c++ - Chromium 嵌入式框架 (C++) 和另一个二进制文件之间的 IPC

gradle - 斯波克+格拉德。并行测试执行

c - 唤醒多个条件变量

c - 程序在每次输入后打印一个值为 10 的额外行

c - K&R 练习 1.9 - 无限循环编程

c - 如何使线程操作的结果对进程中的所有其他线程可见?

Perl 将本地时间格式的时间转换为 YYYYMMDD

c - 在调用exec *()系列函数时,argv的char *元素是否必须唯一?

c - 如何在 C 中将客户端程序重定向到新的任意端口