使用printf在C中的fork()

fork() in c using printf

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
int main()
{
        printf ("print hello");
        fork();
}
1
2
3
4
5
6
int main()
{
        printf ("print hello\
"
);
        fork();
}

输出1是:`print helloprint hello

输出2为:print hello

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


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

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


更改:

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

1
2
3
    printf ("print hello");
    fflush(stdout);
    fork();

默认情况下,stdout通常是行缓冲的。 在示例2)中,可以保证stdoutfork之前被刷新,但是在示例1)中,可能在fork之后发生。 在fork之前冲洗stdout可以确保在fork之前打印字符串。