printf换行符有行缓冲区吗?

时间:2017-03-27 17:20:21

标签: c linux fork

语言: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

根据thisthisprintf() buffers output until a newline is encountered

那么为什么我们在这种情况下有4个“你好世界”呢? (而不是2“你好世界”)

编辑:对不起所有,但是像@GregHewgill说的那样,我从一个输出无法直接到终端的环境运行这个程序,当我在我的计算机上再次检查它时,它只是运行正如所料。

1 个答案:

答案 0 :(得分:2)

  

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

打印换行符通常仅在输出发送到终端设备时才刷新。 例如:

$ ./a.out >out_file
即使使用换行符,

也不会刷新缓冲区。所以,你的期望是有缺陷的。

获得&#34;期望的唯一正确方法&#34;输出(2 hello world和4 bye)要么使用setbuf完全禁用缓冲:

setbuf(stdout, 0);

或使用fflush

fflush(stdout);

每次printf调用后显式刷新。