Mus*_*afa 0 c operating-system system-calls
int main(void) {
printf("abc");
fork();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码的输出是:
abcabc
Run Code Online (Sandbox Code Playgroud)
为什么打印两次,即使fork系统调用在printf语句之后?
因为stdout 是缓冲的,通常是行缓冲的.并且在程序中,缓冲区仅在exit时间或从返回时被刷新main(并且在fork没有失败时发生"两次" ).
尝试fflush(NULL);在之前添加fork();(您应该几乎总是这样做)
顺便说一句,你应该始终保持结果fork并处理三种情况:fork失败,在孩子,在父母.
所以fork表现得如此,但printf没有你想象的天真的直接副作用:它是缓冲所以真正的输出可能发生在后者.您还可以通过更换观察缓冲fork()带sleep(15)(输出在发生exit时,或在年底main,所以之后的sleep,和15秒你的程序将不会明显地输出任何东西)
您也可以使用strace(1)来了解正在发生的系统调用...