不刷新缓冲区会导致文件输出不正确

Does not flushing a buffer lead to files having incorrect output

在下面的代码中,如果我不使用 fflush(STDOUT) 刷新缓冲区,会不会 FILE2 最终同时获得“Hello world 1”和“Hello world 2”,因为缓冲区可能会在程序结束时被刷新,并且它可能会在最后保存这两个语句?

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int FILE1 = dup(STDOUT_FILENO);
    int FILE2 = open("HelloWorld.txt",O_WRONLY|O_CREAT,0666);


    dup2(FILE1,STDOUT_FILENO);
    printf("Hello World 1\n");

    //THE LINE OF CONCERN
    fflush(stdout);

    dup2(FILE2,STDOUT_FILENO);

    printf("Hello World 2\n");
    close(FILE2);
    close(FILE1);
    return 0;
}

问题是你在这里工作的层次不同。 stdio 系统和 stdout 将有自己的缓冲区,当您执行第二个 dup2 调用时,该缓冲区不会关闭或刷新。当 stdout 在进程终止时关闭时,stdout 缓冲区的内容仍将保留并写入。

因此需要 fflush 调用才能将 stdout 缓冲区实际刷新到“文件”。