我正在尝试在C(./a.out > out.log
)中重定向输出,我希望printf打印到文件而不是stdout,由于某种原因我无法实现,我也无法理解是什么' copy'表示在linux手册的dup2
描述中:
dup2()使newfd成为oldfd的副本,首先关闭newfd 必要
复制是指重定向吗?
感谢您的帮助。
#include <stdio.h>
#include <unistd.h>
int main(){
FILE *fout=fopen("out.log","wt");
if(!fout)
return 1;
printf("Hi stdout\n");
if(dup2(fileno(fout),fileno(stdout) == -1)) return 1;
printf("Hi file\n");
fclose(fout);
return 0;
}
答案 0 :(得分:2)
是的,这是一种重定向方式。除了拼写错误之外,您的代码将起作用:
你正在使用编号为fileno(stdout) == -1
的fd;由于stdout
最初是打开文件描述符1
,因此比较为1 == -1
,这是假的;即0
,你最终通过标准输入而不是标准输出重复新文件描述符。
显然代码应该是:
// notice the parentheses here v
if (dup2(fileno(fout),fileno(stdout)) == -1) return 1;
附录,你可能会想要在啜饮之前fflush
stdout,只是为了确定 - 因为stdout可能不是行缓冲的。
使用freopen
重新打开stdout
更容易,但这只会重定向stdio函数的输出,而不是unix系统调用或子进程的输出。