为什么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)来了解正在发生的系统调用…