printf换行符有行缓冲区?

语言:C,OS:Linux

码:

#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main(void) { fork(); printf("hello world\n"); fork(); printf("bye\n"); return 0; } 

输出:

 hello world bye hello world bye hello world bye hello world bye 

根据这个和这个 , printf() buffers output until a newline is encountered

那么为什么在这种情况下我们有4个“hello world”? (而不是2个“hello world”)

编辑 :对不起所有,但像@GregHewgill说,我运行这个程序从输出不能直接到terminal的环境,当我再次检查我的电脑,它只是按预期运行。

根据这个和这个,printf()缓冲输出,直到遇到一个换行符。

通常只有在输出到终端设备时才打印换行符。 例如:

 $ ./a.out >out_file 

即使使用换行符也不会刷新缓冲区。 所以,你的期望是有缺陷的。

获得“所需”输出(2 hello world和4 bye )的唯一正确方法是使用setbuf完全禁用缓冲区:

 setbuf(stdout, 0); 

或使用fflush

 fflush(stdout); 

在每个printf调用之后清晰地刷新。