不刷新缓冲区会导致文件输出不正确
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
缓冲区实际刷新到“文件”。
在下面的代码中,如果我不使用 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
缓冲区实际刷新到“文件”。