2011-01-28 5 views
23

私のCプログラムでは、STDOUTを一時的に "/ dev/null"(たとえば)にリダイレクトしたいと思います。その後、 "/ dev/null"に書き込んだ後に を実行して、STDOUTを復元したいとします。これをどうすれば管理できますか?次のようにあなたがそれを行うことができますPOSIXシステムでCプログラムのファイルにstdoutを一時的にリダイレクトする方法はありますか?

答えて

47

、:あなたが欲しい

int bak, new; 
fflush(stdout); 
bak = dup(1); 
new = open("/dev/null", O_WRONLY); 
dup2(new, 1); 
close(new); 
/* your code here ... */ 
fflush(stdout); 
dup2(bak, 1); 
close(bak); 

は、さらに一般には不可能です。

freopenを使用しているすべてのソリューションは、元のstdoutを復元できないため、間違っています。 stdoutへの代入による解はすべて正しくありません。stdoutは左辺値ではありません(タイプFILE *の式に展開されるマクロ)。

+0

dup2は使用しないでください。 close(new)を使用し、次にdup(1)を使用します。 dup()はあなたが正しい記述子を得ることを保証します。 'newfdが開いていれば、close() 時に報告されたエラーは失われます。慎重なプログラマーは、最初に newfdを閉じることなくdup2を使用しません。 ' –

+9

@ MoraruLilian:私は非常に意図的に' dup2'を使いました。あなたのコメントには、引数とコードとが混在しているので、あなたのポイントは何かを確認することはできませんが、 'dup2 'を除いたすべてのソリューションは**危険な競合条件**を持っています。 'dup2(x、y)'のポイントは 'y' **原子的**を' x'のコピーに置き換えることです。 –

関連する問題