为什么这段代码片段只生成字母“XUVUV”?我认为“UXUVV”也是可能的,但我从来没有得到那个输出。
if (fork() == 0){
printf("X");
}
printf("U");
wait(NULL);
printf("V");
答案 0 :(得分:4)
没有印刷新品;因此,在流程终止之前不会显示任何输出。
子进程将X
添加到其缓冲区;父母不打印X
。然后,孩子将U
添加到其缓冲区。它等待,但等待立即返回;孩子没有孩子可以等待。它将V
添加到其缓冲区。它终止,因此XUV
被刷新。
同时,父母已将U
添加到其缓冲区;然后它等待孩子完成。孩子完成后,XUV
已被打印。父级将V
添加到其缓冲区并退出;其UV
被刷新到输出。
结果是你每次都看到XUVUV
。
在父项将U
添加到缓冲区之前或之后,您无法判断子项是否将其字符添加到其缓冲区,但您确实知道子项已在父项添加{{{}}之前完成。 1}},所以输出是确定的,除非你做一些像V
这样的事情,以便在你做任何输出操作之前使标准输出无缓冲。
如果为每个打印操作添加换行符,事情会变得更复杂;时机不再是确定的。