ここにコードスニペットがあります。dup2が連続して発生しないのはなぜですか?
int saved_stdout = dup(1);
int fd = open("file.txt", O_WRONLY | O_CREAT, 0640);
close(1);
dup(fd);
close(fd);
printf("This text should go into the file\n");
//restore stdout
dup2(saved_stdout, 1);
printf("stdout restore");
私はdupとdup2について学びたいと考えています。だから私は最初にstdoutに私のfile.txtを接続しました。だから私はprintfを使用するたびに、stdoutの代わりにfile.txtに書き込む必要があります。しかし、いったんこの使い方が終わると元に戻したいので、最後にdup2も使います。
"このテキストはファイルに保存する必要があります\ n"というテキストは、実際にはファイルには入れられませんが、stdoutには印刷されるという問題があります。なぜそうなのか?私はそれのためにひどいです。そのdup2呼び出しがそのprintf( "This text ...")の前に起こっていることがわかりました。ステートメント、なぜそう?
これは私が探していたものです。ありがとうございました – posixKing
'fflush()'は動作しますが、間違った理由があると思います。 'open()'の直後に 'printf()'を置くだけで、より微妙なことが起こります。問題は、ファイル記述子とFILE構造が混在していることです。これはおそらく未定義の領域であり、異なるシステムで異なる結果が得られる可能性があります。あなたが望むことをする正しい方法は 'freopen(" file.txt "、" w "、stdout)'です。その操作は明確に定義されています。 – gilez
@gilez何かを書いてファイル記述子を変更する間は、安全でなければならないと思います。私は、 'printf()'が起きた時ではなく、 'stdin'が開かれた時にバッファリングが初期化されているのではないかと思っています。しかし、それは怠惰で、最初の書き込みでそれを行うことができます。 – Barmar