2016-09-30 7 views
2

execvpコマンドがファイルに送信されるようにファイル記述子を変更したいと思います。その後、stdoutをコンソールにリセットし直したいと思います。Cファイルをstdoutに出力してリセットする

これは私がこれまで持っているものです。

int main() { 
    printf("to console\n"); 
    int stdoutfd = dup(STDOUT_FILENO); 
    FILE* file = fopen("./test.txt","ab+"); 
    int filefd = fileno(file); 
    dup2(filefd,STDOUT_FILENO); 
    char *args[] = {"ls","-la",NULL}; 
    execvp(args[0],args); 
    dup2(stdoutfd,STDOUT_FILENO); 
    close(stdoutfd); 
    printf("to console\n"); 
} 

コンソールに最初printf版画、そして「LS -la」コマンドでexecvpのがtest.txtファイルに印刷されたが、私の問題がありますということsecond printfはどこにも印刷されません。

私は同様の質問が C restore stdout to terminalで解決されていることを認識していますが、その解決策は機能していないようです。

+4

'execvp'は正常に終了しません。 'execvp'は現在のプロセスイメージを新しいプロセスイメージに置き換えます。"つまり、 'execvp'呼び出しでエラーが発生しない限り、' execvp'の後のコードは実行されません。おそらく、 'execvp'を呼び出す前に' fork'しておくといいでしょう。 – kaylum

+0

他の答えがうまくいかない理由を考えましたか?それはしっかりとしたアドバイスを提供します(そして、私は受け入れられた答えではありません)。あなたのプログラムが正常であれば動作します。質問の例に 'fork()'がないので、 'execvp()'の成功後に何も実行されません。 'execvp()'が動作する場合、最後の3行は決して実行されません。 '' ls ''文字列を' 'not-the-ls''に変更することができます( 'not-the-ls'というコマンドがないと仮定します)。 'to console'メッセージが表示されます。 –

+0

修正;関数の 'exec *()'ファミリが返す唯一の時間は、実行を要求されたものを実行するのに失敗したときだけです。 –

答えて

2

以降はありません。 execvp関数呼び出しがプロセスを置き換えます。成功した場合、残りのコードは実行されません。再割り当てSTDOUT異なる場所

これはであるに行くに関する

0

http://stackoverflow.com/questions/584868/rerouting-stdin-and-stdout-from-c

なぜ)(freopenはでしょうか?

116. The primary use of the freopen function is to change the file associated with a standard text stream (stderr, stdin, or stdout), as those identifiers need not be modifiable lvalues to which the value returned by the fopen function may be assigned. 

freopenは一般に、例えば、誤用されている:C89仕様は上のセクションの巻末のいずれかで答えを有しますstdin = freopen( "newin"、 "r"、stdin);.これはfclose(stdin)よりも移植性がありません。 stdin = fopen( "newin"、 "r");.どちらの式もstdinに割り当てようとしますが、割り当てが保証されていません。

freopenを使用する正しい方法は、割り当てを省略することです。freopen( "newin"、 "r"、stdin);

関連する問題