为什么fork系统调用奇怪的行为?

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语句之后?

Ideone链接

Bas*_*tch 6

因为stdout 是缓冲的,通常是行缓冲的.并且在程序中,缓冲区仅在exit时间或从返回时被刷新main(并且在fork没有失败时发生"两次" ).

尝试fflush(NULL);在之前添加fork();(您应该几乎总是这样做)

顺便说一句,你应该始终保持结果fork并处理三种情况:fork失败,在孩子,在父母.

所以fork表现得如此,但printf没有你想象的天真的直接副作用:它是缓冲所以真正的输出可能发生在后者.您还可以通过更换观察缓冲fork()sleep(15)(输出在发生exit时,或在年底main,所以之后sleep,和15秒你的程序将不会明显地输出任何东西)

您也可以使用strace(1)来了解正在发生的系统调用...

  • `fork()`复制整个过程,甚至包含未打印的`abc`的缓冲区.当它们都退出时,每个进程都使用未打印的`abc`刷新其缓冲区,因此您会看到它两次,因为每个进程在刷新时都会打印它. (2认同)