パイプが適切に配置され、stdoutとstderrを上書きしたら、どこのprintf行くのですか?

StackOverflow https://stackoverflow.com/questions/663971

  •  21-08-2019
  •  | 
  •  

質問

私は標準エラー出力と標準出力をリダイレクトするためのパイプを設定しています。私はprintfのを使用する場合は、標準出力にデータを送信しないか、1をストリーミングする?

それがstdoutにそれを送信した場合、どのように私は代わりに1をストリーミングするためにデータを送信するように設定することができますか?

役に立ちましたか?

解決

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

そして、あなたは<(その場合には、停止)の本当にの奇妙な何かをやっている場合を除き、ストリーム1(ファイルディスクリプタ1に関連付けられたストリームを意味すると仮定した場合)のは、のstdoutです/ P>

他のヒント

  

私はprintfのを使用する場合、それは標準出力にデータを送信んか1をストリーミングする?

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

  

それがstdoutにそれを送信した場合、どのように私は代わりに1をストリーミングするためにデータを送信するように設定することができますか?

だから、なしあなたは特別なことをする必要はありません - 。それは自動的に世話をされる

私は関与層のご理解が少し見当違いだと思います。

Cランタイムのprintfは(あなたがFILE *stdoutまたは類似を使用しない限り)freopenを、使用していますfdopen(1, "w")を効果的に等価である。つまり、ファイルディスクリプタ#1に出力をバッファリング

通常、あなたがmy_programを実行し、ファイルディスクリプタ#1は、端末に装着されています。あなたがmy_program > fileを実行すると、のプログラムも実行を開始する前に、ファイルディスクリプタ#1は、<全角> fileに取り付けられています。だから、printf、ディスクリプタ#1をファイルに落書きされ(あなたがそれを変更しない限り)、stdoutへの書き込み、ファイルではなく、端末に印刷されます。

あなたのプログラムの外の何もあなたのバッファードI / Oまたはあなたがあなた自身のstdoutで何気にしない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top