为什么这个代码片段只产生字母“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/