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

时间:2016-12-20 19:39:04

标签: c fork parent wait child-process

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

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

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

1 个答案:

答案 0 :(得分:4)

没有印刷新品;因此,在流程终止之前不会显示任何输出。

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

同时,父母已将U添加到其缓冲区;然后它等待孩子完成。孩子完成后,XUV已被打印。父级将V添加到其缓冲区并退出;其UV被刷新到输出。

结果是你每次都看到XUVUV

在父项将U添加到缓冲区之前或之后,您无法判断子项是否将其字符添加到其缓冲区,但您确实知道子项已在父项添加{{{}}之前完成。 1}},所以输出是确定的,除非你做一些像V这样的事情,以便在你做任何输出操作之前使标准输出无缓冲。

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