c – 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

根据this和this,printf()缓冲输出直到遇到换行符.

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

编辑:对不起所有,但像@GregHewgill所说,我从一个输出不能直接到终端的环境运行这个程序,当我在我的计算机上再次检查它时,它只是按预期运行.

最佳答案

According to this and this, printf() buffers output until a newline is encountered.

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

$./a.out >out_file

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

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

setbuf(stdout, 0);

或使用fflush

fflush(stdout);

每次printf调用后显式刷新.

点赞