2017-02-18 122 views
0

我想重定向输出在C(./a.out > out.log),我希望printf打印到文件而不是标准输出,由于某种原因,我无法实现这一点,我也不明白什么是'复制”中描述dup2在linux手动装置:输出重定向在C

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; 
} 
+1

手册页的[更新版本](http://man7.org/linux/man-pages/man2/dup.2.html)更具信息性。它实际上意味着文件描述符的**副本**,所以系统调用确实可以用于实现重定向。 – chrk

回答

2

是的,这是一种重定向的方式。您的代码将工作,否则,除了输入错误:

你正在探索编号fileno(stdout) == -1;由于stdout最初对文件描述符1打开,所以比较结果为1 == -1,这是错误的;即0,您最终将通过标准输入而不是标准输出重复新文件描述符。

显然的代码应该是:

// notice the parentheses here  v 
if (dup2(fileno(fout),fileno(stdout)) == -1) return 1; 

补遗,你可能会想fflush标准输出dupping之前,只是要确定 - 因为标准输出可能无法行缓冲。

使用freopen重新打开stdout会更方便,但这只会重定向stdio函数的输出,而不是来自unix系统调用或子进程的输出。

+0

哈哈,不错。谢谢。 – Kikapi