即使在使用 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
}
我尝试过的其他事情:
- 更改打开文件的权限(添加
O_RDWR
)
- 运行在 2 台单独的 PC 上运行 - 我 运行 主要是在远程桌面上到 uni pc linux,但也在笔记本电脑上安装了 VMware。
- 尝试在
dup2
上使用 close
+ dup
组合
- 尝试将条件与
perror
一起使用,看看是否有任何步骤会提示我为什么它不起作用。
- 尝试使用
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);
}
我正在学习操作系统课程,并在 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
}
我尝试过的其他事情:
- 更改打开文件的权限(添加
O_RDWR
) - 运行在 2 台单独的 PC 上运行 - 我 运行 主要是在远程桌面上到 uni pc linux,但也在笔记本电脑上安装了 VMware。
- 尝试在
dup2
上使用 - 尝试将条件与
perror
一起使用,看看是否有任何步骤会提示我为什么它不起作用。 - 尝试使用
STDOUT_FILENO
而不是输出 1
close
+ dup
组合
非常感谢对此的任何帮助!
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);
}