int main(void) {
printf("abc");
fork();
return 0;
}
此代码的输出为:
abcabc
为什么打印两次,即使fork系统调用在printf语句之后?
答案 0 :(得分:6)
因为stdout
是缓冲的,所以通常是行缓冲的。在你的程序中,缓冲区仅在exit
时或从main
返回时被刷新(当fork
没有失败时,会发生“两次”)。
尝试在fflush(NULL);
之前添加fork();
(您几乎应该这样做)
顺便说一句,你应该始终保持fork
的结果并处理three cases:fork
失败,在孩子中,在父母身上。
所以fork
表现得应该如此,但printf
没有你想象的天真的直接副作用:它是缓冲所以实际输出可能发生在后者。您还可以通过将fork()
替换为sleep(15)
(exit
时间或main
结束时的输出,以及之后的来观察缓冲> sleep
,15秒钟你的程序显然不输出任何东西)
您也可以使用strace(1)来了解正在发生的系统调用......