为什么fork系统调用奇怪的行为?
int main(void) { printf("abc"); fork(); return 0; }
此代码的输出是:
abcabc
为什么打印两次,即使fork系统调用在printf语句之后?
Ideone链接
因为stdout
是缓冲的,通常是行缓冲的。 在你的程序中,缓冲区只在exit
时刷新,或者从main
返回时(当fork
没有失败时发生“两次”)。
尝试添加fflush(NULL);
在fork();
之前fork();
(你几乎总是这样做)
顺便说一句,你应该始终保持fork
的结果并处理三种情况 : fork
失败,在child中,在parent中。
所以fork
的行为应该如此,但是printf
并没有你想象的那种天真的直接副作用:它是缓冲所以真正的输出可能发生在后者。 你也可以通过用sleep(15)
替换fork()
观察缓冲(输出发生在exit
时,或者在main
结束时,所以在 sleep
,15秒你的程序显然不会输出任何东西)
您也可以使用strace(1)来了解正在发生的系统调用…