1

stderrとstdoutをリダイレクトするパイプを設定しました。printfを使用すると、データがstdoutに送信されますか、それともストリーム1に送信されますか?

stdoutに送信する場合、代わりにストリーム1にデータを送信するように構成するにはどうすればよいですか?

4

3 に答える 3

3

printfを使用すると、データがstdoutに送信されますか、それともストリーム1に送信されますか?

このprintf関数はにデータを送信しますstdout。リダイレクトstdoutしたので、コンソール以外のファイルを指すようになりました。printfそれが何であるかを気にしない、それはそれができる限り書き続けるだけです。

stdoutに送信する場合、代わりにストリーム1にデータを送信するように構成するにはどうすればよいですか?

したがって、特別なことをする必要はありません。自動的に処理されます。

于 2009-03-19T20:46:13.220 に答える
3

printfは常にデータをstdoutに送信します。パイプを使用してstdoutをリダイレクトした場合は、stdoutがパイプされているプロセスに移動します。

そして、ストリーム1(ファイル記述子1に関連付けられたストリームを意味すると仮定)は、本当に奇妙なことをしている場合(この場合は停止)を除いて、stdoutです。

于 2009-03-19T20:48:56.240 に答える
2

関係するレイヤーについてのあなたの理解は少し間違っていると思います。

Cランタイムのprintfusesは、(使用するか類似FILE *stdoutしていない限り)実質的に:、つまりファイル記述子#1のバッファリングされた出力と同等です。freopenfdopen(1, "w")

通常、を実行するmy_programと、ファイル記述子#1が端末に接続されます。を実行すると、プログラムの実行が開始される前にmy_program > file、ファイル記述子#1がアタッチされます。したがって、に書き込むと、(変更しない限り)ファイル記述子#1に落書きされ、端末ではなくファイルに出力されます。file printfstdout

プログラムの外部では、バッファリングされたI/Oや独自のI/Oで何をするかについては何も気にしませんstdout

于 2009-03-19T20:52:48.727 に答える