5

有 2 个不同的程序,它们很小,例如:

int main()
{
        printf ("print hello");
        fork();
}

int main()
{
        printf ("print hello\n");
        fork();
}

输出 1 是:`print helloprint hello

输出 2 是:print hello

问题是,为什么\n只有一个打印一次,而第一个打印两次?

4

2 回答 2

8

您遇到了系统printf实现的缓冲行为。在第一种情况下,字符串被打印到缓冲区,但由于没有换行符(并且您没有调用fflush),它只是坐在那个缓冲区中。然后你分叉,当各自的进程退出时,两个分叉的缓冲区都会被刷新。

在第二种情况下,\n导致缓冲区在分叉之前被刷新,因此当分叉的进程退出时没有剩余的输出。

于 2013-07-03T17:35:28.687 回答
4

改变:

    printf ("print hello");
    fork();

    printf ("print hello");
    fflush(stdout);
    fork();

默认情况下,stdout通常是行缓冲的。在您的示例 2)中,您可以保证stdout在. Flushing before保证你在.forkforkstdoutforkfork

于 2013-07-03T17:34:35.880 回答