関数呼び出しの戻り値を確認する必要があります。ほとんどの機能では、エラー状態をチェックする必要があります。そうすることで、最初に存在しない場合にopen()
が要求されたファイルを作成したければ、O_CREAT
フラグを追加する必要があるという問題が明らかになっているかもしれません。
しかし、これはあなたの主な問題ではありません - あなたはバッファリングの問題を扱っています。最初のprintf()
からの出力はメモリにバッファされます。したがって、printf()
が呼び出されたときにファイル記述子1がファイルを参照しても、書き込むデータはすぐに宛先ファイルにフラッシュされません。オリジナルのstdout
ファイルハンドルを復元するので、データが実際にフラッシュされると元のstdoutに移動します。 stdout
バックを切り替える前にfflush()
INGによってこの問題を解決:
int pfd = open("file", O_WRONLY | O_CREAT, 0777);
int saved = dup(1);
close(1);
dup(pfd);
close(pfd);
printf("This goes into file\n");
fflush(stdout); // <-- THIS
// restore it back
dup2(saved, 1);
close(saved);
printf("this goes to stdout");
も注意dup2()
が特定ファイルディスクリプタの番号にファイルディスクリプタをデュープのためのクリーンで安全であること。あなたはそれを復元するときに行いますが、最初のリダイレクションのためにも行うべきです。
'dup(pfd);'はstdoutをファイルに書き出しません。 – tkausl
'dup2'を何回か使ったことはありますか? –
申し訳ありません私は 'dup(pfd)'の前に 'close(1)'を追加するのを忘れました – posixKing