2011-08-07 13 views
5

以下のコードはstdoutをファイルfname &にリダイレクトし、元のstdoutにリダイレクトします。それは私のためにうまく動作します。 しかし、実際にどのように動作するのか理解できません。もし誰かが私の理解を助けることができれば、私はそれを気付かせるでしょう。この標準出力リダイレクトの仕組みは?

printf("\n This is console"); 
    fflush(stdout); 
    fgetpos(stdout, &pos); 
    fd = dup(fileno(stdout)); 
    freopen(fname, "a+", stdout); 

    printf("inside file op"); 

    fflush(stdout); 
    dup2(fd,fileno(stdout)); 
    close(fd); 
    clearerr(stdout); 
    fsetpos(stdout, &pos); 
    printf("\nBack to Console"); 
+0

はい、それをコピーしてください。心に留めておきます。ありがとう:) – vindyz

+2

上記の神々、なぜ誰かがしたいのですか? (stdoutへの書き込みを主張しているソースのないライブラリのための、欲求不満の回避策の他にも)。 –

+0

デバッグの目的で別のログメッセージを別のファイルにリダイレクトしたい場合は、そのために非常に便利です。 – vindyz

答えて

14

行ごとに行こうとします。最初の行はstdoutに何かを出力します。

fflush(stdout); 

printf("\n This is console"); 

そして、それは、バッファ内の残りのすべてのデータがstdoutに送信されますし、ファイルデータと混ざっ得ることはありませんので、stdoutをフラッシュ現在、stdoutに現在の位置を格納します。それ以外の場合は、stdoutがすでにファイルに転送されている場合は、その前の部分を(?)上書きする可能性があります。

fgetpos(stdout, &pos); 

現在、stdoutのファイルディスクリプタをクローンします。私たちはどこstdoutポイントに変更しようとしているので、我々は、元のコピーを保持する必要があります。

freopen(fname, "a+", stdout); 

fd = dup(fileno(stdout)); 

今、私たちはすべてが保存されていることを、我々はファイルとしてstdoutを再度開くことができます

この時点ではstdoutがファイルにリダイレクトされています。

printf("inside file op"); 

これで印刷が完了しました。我々はstdout(現在のファイル)をフラッシュする必要があるので、通常のstdoutデータと混ざっません:

fflush(stdout); 

はその後、我々は現在のstdout記述子の上に、元stdoutファイル記述子のクローンを作成します。

dup2(fd,fileno(stdout)); 

クローン1が今閉じることができます:

close(fd); 

これはここにあるなぜ私はかなりよく分からないが、これはファイルへの書き込みに発生したエラークリア:

clearerr(stdout); 

今私たちはstdoutの地位を回復しました。それは元々のファイルにリダイレクトされた場合は、もう一度、私の知る限り、これはのみ有用です:

fsetpos(stdout, &pos); 

は、今、私たちは、元stdoutに戻っているので、我々は再び印刷することができます。

printf("\nBack to Console"); 
+0

はすばらしい音です..今ははるかに明確です。ありがとうございます。 例外的に詳細な回答については、 – vindyz

+0

+1。 – templatetypedef

+0

には他の方法があります。 – vindyz

関連する問題