23
私のCプログラムでは、STDOUTを一時的に "/ dev/null"(たとえば)にリダイレクトしたいと思います。その後、 "/ dev/null"に書き込んだ後に を実行して、STDOUTを復元したいとします。これをどうすれば管理できますか?次のようにあなたがそれを行うことができますPOSIXシステムでCプログラムのファイルにstdoutを一時的にリダイレクトする方法はありますか?
私のCプログラムでは、STDOUTを一時的に "/ dev/null"(たとえば)にリダイレクトしたいと思います。その後、 "/ dev/null"に書き込んだ後に を実行して、STDOUTを復元したいとします。これをどうすれば管理できますか?次のようにあなたがそれを行うことができますPOSIXシステムでCプログラムのファイルにstdoutを一時的にリダイレクトする方法はありますか?
、:あなたが欲しい
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 *
の式に展開されるマクロ)。
dup2は使用しないでください。 close(new)を使用し、次にdup(1)を使用します。 dup()はあなたが正しい記述子を得ることを保証します。 'newfdが開いていれば、close() 時に報告されたエラーは失われます。慎重なプログラマーは、最初に newfdを閉じることなくdup2を使用しません。 ' –
@ MoraruLilian:私は非常に意図的に' dup2'を使いました。あなたのコメントには、引数とコードとが混在しているので、あなたのポイントは何かを確認することはできませんが、 'dup2 'を除いたすべてのソリューションは**危険な競合条件**を持っています。 'dup2(x、y)'のポイントは 'y' **原子的**を' x'のコピーに置き換えることです。 –