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

时间:2016-01-24 16:51:12

标签: c operating-system system-calls

int main(void) {
    printf("abc");
    fork();
    return 0;
}

此代码的输出为:

abcabc

为什么打印两次,即使fork系统调用在printf语句之后?

Ideone link

1 个答案:

答案 0 :(得分:6)

因为stdout是缓冲的,所以通常是行缓冲的。在你的程序中,缓冲区仅在exit时或从main返回时被刷新(当fork没有失败时,会发生“两次”)。

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

顺便说一句,你应该始终保持fork的结果并处理three casesfork失败,在孩子中,在父母身上。

所以fork表现得应该如此,但printf没有你想象的天真的直接副作用:它是缓冲所以实际输出可能发生在后者。您还可以通过将fork()替换为sleep(15)exit时间或main结束时的输出,以及之后的来观察缓冲> sleep,15秒钟你的程序显然不输出任何东西)

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