2017-12-08 23 views
0

ここに私のコードがあり、それを動作させることができません。stdoutをファイルにリダイレクトしてからstdoutを元に戻す方法はありますか?

int pfd = open("file", O_WRONLY, 0777); 
int saved = dup(1); 
close(1); 
dup(pfd); 
close(pfd); 
printf("This goes into file\n"); 

// restore it back 
dup2(saved, 1); 
close(saved); 
printf("this goes to stdout"); 

私は自分のコードにいくつかの編集を追加しました。

+0

'dup(pfd);'はstdoutをファイルに書き出しません。 – tkausl

+0

'dup2'を何回か使ったことはありますか? –

+0

申し訳ありません私は 'dup(pfd)'の前に 'close(1)'を追加するのを忘れました – posixKing

答えて

0

関数呼び出しの戻り値を確認する必要があります。ほとんどの機能では、エラー状態をチェックする必要があります。そうすることで、最初に存在しない場合に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()特定ファイルディスクリプタの番号にファイルディスクリプタをデュープのためのクリーンで安全であること。あなたはそれを復元するときに行いますが、最初のリダイレクションのためにも行うべきです。

+0

私の悪い、それは私の部分で間違いだった。コメントを撤回します。ご回答有難うございます。 fflushがトリックを行います – posixKing

関連する問題