在C中重定向stdout时的奇怪行为

我正在尝试将stdout重定向到一个文件,然后在C中将其恢复为原始文件,但我面临以下奇怪的问题 – 下面的代码片段成功写入
in stdout
in stdout
在stdout和相应in file中的文件中都可以。

 #include  #include  #include  #define STDOUT 1 int main(int argc, char* argv[]){ printf("in stdout \n"); int old_out = dup(STDOUT); close(STDOUT); int fd = open("./redirected",O_CREAT|O_RDWR|O_TRUNC,0777); printf("in file \n"); close(fd); dup(old_out); printf("in stdout\n"); return EXIT_SUCCESS; } 

但是,删除我的主要function的第一行:

 #include  #include  #include  #define STDOUT 1 int main(int argc, char* argv[]){ int old_out = dup(STDOUT); close(STDOUT); int fd = open("./redirected",O_CREAT|O_RDWR|O_TRUNC,0777); printf("in file \n"); close(fd); dup(old_out); printf("in stdout\n"); return EXIT_SUCCESS; } 

导致in file
in stdout
写在stdout上,没有写在文件中。 我想知道这是怎么发生的? 谢谢你的帮助。

这是一个缓冲问题。 您在“文件”中写入的缓冲区在重新安装stdout之前未刷新,因此输出将转到stdout而不是文件。 添加fflush(stdout); 把它固定在这里。