我正在尝试使用C中的重定向将输入重定向到一个文件,然后将标准输出设置回打印到屏幕。有人能告诉我这段代码有什么问题吗?
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char** argv) {
//create file "test" if it doesn't exist and open for writing setting permissions to 777
int file = open("test", O_CREAT | O_WRONLY, 0777);
//create another file handle for output
int current_out = dup(1);
printf("this will be printed to the screen\n");
if(dup2(file, 1) < 0) {
fprintf(stderr, "couldn't redirect output\n");
return 1;
}
printf("this will be printed to the file\n");
if(dup2(current_out, file) < 0) {
fprintf(stderr, "couldn't reset output\n");
return 1;
}
printf("and this will be printed to the screen again\n");
return 0;
}
答案 0 :(得分:4)
在完成此操作之前,您必须确保做的一件事就是在将fflush(stdout);
文件描述符从其下面切换出来之前调用stdout
。可能发生的事情是C标准库正在缓冲您的输出,而不知道您正在转移它下面的文件描述符。您使用printf()
编写的数据实际 发送到基础文件描述符,直到其缓冲区已满(或您的程序从main
返回)。
像这样插入电话:
fflush(stdout);
if(dup2(file, 1) < 0) {
在调用dup2()
之前。
答案 1 :(得分:3)
您的第二次dup2
来电错误,请替换为:
if (dup2(current_out, 1) < 0) {
答案 2 :(得分:1)
只需将dup2(current_out, file)
替换为dup2(current_out, 1)
,事情应该会更好。