パイプが適切に配置され、stdoutとstderrを上書きしたら、どこのprintf行くのですか?
-
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
で何気にしない。