web-dev-qa-db-ja.com

stdoutをCプログラムのファイルに一時的にリダイレクトするにはどうすればよいですか?

Cプログラム内で、STDOUTを一時的に「/ dev/null」にリダイレクトしたいと思います(たとえば)。次に、「/ dev/null」に書き込んだ後、STDOUTを復元したいと思います。これをどのように管理しますか?

26
Frank

POSIXシステムでは、次のように実行できます。

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 *の式に展開されるマクロです)。

49
R..