c - 为什么这段带有 fork() 的代码只产生一个输出?

标签 c fork parent wait child-process

为什么这个代码片段只产生字母“XUVUV”?我认为“UXUVV”也有可能,但我从来没有得到那个输出。

if (fork() == 0){
    printf("X");
}

printf("U");
wait(NULL);
printf("V");

最佳答案

没有打印换行符;因此,在进程终止之前不会出现任何输出。

子进程添加X到它的缓冲区;父级不打印 X。然后 child 将 U 添加到它的缓冲区。它等待,但等待立即返回; child 没有 child 可以等待。它将 V 添加到它的缓冲区。它终止,因此 XUV 被刷新。

与此同时,父级已将 U 添加到其缓冲区;然后它等待 child 完成。当 child 完成后,XUV 就被打印出来了。父级将 V 添加到其缓冲区并退出;它的 UV 被刷新到输出。

结果是您每次都会看到 XUVUV

您无法判断子项是在父项将其 U 添加到其缓冲区之前还是之后将其字符添加到其缓冲区,但您可以知道在父项添加 V,因此输出是确定的,除非您在执行任何输出操作之前执行类似 setvbuf(stdout, 0, _IONBF, 0) 的操作以使标准输出无缓冲。

如果在每个打印操作中添加换行符,事情就会变得更加复杂;时间不再是确定的。

关于c - 为什么这段带有 fork() 的代码只产生一个输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41250040/

相关文章:

检查命令行输入是否为数字

c - 为 C/C++ 写一个宏 #include

使用 VC++ Express 在 C 中创建文本文件

c++ - wait(NULL) 似乎导致 child 停止执行

JavaScript 继承与 jQuery - 调用父函数

CSS - 如何只针对 parent 而不针对 child

c - 使用第二个字段排序时 qsort 是否保留原始顺序?

c - 在 VS 2013 和 Cygwin 中使用 fork()

c - getrusage 子进程

jQuery 在 $this 的父级中查找下一个 div