即使在使用 dup2/dup 之后,C 程序也会打印到终端而不是文件

C program prints to terminal instead of file even after using dup2/dup

我正在学习操作系统课程,并在 Linux 上用 C 做作业。 在一项作业中,我应该重定向并输出到一个文件,但由于某种原因,我一直在终端中获取输出。 我尝试编写一个简单的程序来做到这一点,但它仍然不起作用:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/fcntl.h>
#include <dirent.h>

void main(int argc, char* argv[]) {
    int file1 = open("./text_try", O_CREAT | O_EXCL, 0666) //open file
    printf("write to screen\n"); //print to screen
    int oldOut = dup(1); //save screen FD
    dup2(file1,1); //change output stream from screen to file
    printf("write to file"); //print to file
    dup2(oldOut,1); //change output stream from file back screen 
    printf("write to screen");  //print to screen
}

我尝试过的其他事情:

  1. 更改打开文件的权限(添加 O_RDWR
  2. 运行在 2 台单独的 PC 上运行 - 我 运行 主要是在远程桌面上到 uni pc linux,但也在笔记本电脑上安装了 VMware。
  3. 尝试在 dup2
  4. 上使用 close + dup 组合
  5. 尝试将条件与 perror 一起使用,看看是否有任何步骤会提示我为什么它不起作用。
  6. 尝试使用 STDOUT_FILENO 而不是输出 1

非常感谢对此的任何帮助!

stdio 通常将输出缓冲到 stdout——它在连接到终端时是行缓冲的,在连接到文件时是完全缓冲的。由于您没有写任何换行符,因此它不会在任何一种模式下自动刷新缓冲区。当程序退出时,缓冲区会自动刷新,此时它会写入 FD 1 连接到的最后一个流。

使用 setvbuf() 关闭缓冲,或者在 printf() 调用之间显式刷新输出。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/fcntl.h>
#include <dirent.h>

void main(int argc, char* argv[]) {
    int file1 = open("./text_try", O_CREAT | O_EXCL, 0666) //open file
    printf("write to screen\n"); //print to screen
    int oldOut = dup(1); //save screen FD
    dup2(file1,1); //change output stream from screen to file
    printf("write to file"); //print to file
    fflush(stdout);
    dup2(oldOut,1); //change output stream from file back screen 
    printf("write to screen");  //print to screen
    fflush(stdout);
}