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



我正试图将stdout重定向到一个文件,然后用C将其还原回原始文件,但我面临以下奇怪的问题-以下代码成功地写入了
in stdout
in stdout
在stdout和相应文件中的in file中,这都是正常的。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#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 stdoutn");
    return EXIT_SUCCESS;
}

然而,删除我的主要功能的第一行:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#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 stdoutn");
    return EXIT_SUCCESS;
}

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

这是一个缓冲问题。在重新安装stdout之前,写入"in file"的缓冲区不会被刷新,因此输出将进入stdout,而不是文件。添加fflush(stdout);在这里修复了它。

最新更新