2017-02-18 118 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