~によるとこの回答、、、およびはすべて最初に同じ場所(と同じ)に接続されており、合計stdin
を読み書きする規則は次のとおりです。stdout
stderr
/dev/tty
stdin
stdout
stderr
それでは、なぜ1つにマージせずに分離stdin
するのですか?stdout
答え1
FILEポインタ(stdin、stdout、stderrなど)には、デフォルトのファイル記述子を1つだけ含めることができます。したがって、次のパイプライン設定がある場合:
ls | grep foo | less
grepのstdin、stdout、およびstderrには2つのリンクパイプライン()があるため、すべて異なるfileno()があります。したがって、他のファイルも必要です。
答え2
入力ストリームを出力ストリームから分離すると、プログラムが入力を読み込み、同時に出力を書き込むことが容易になります。
これにより、プログラムがリダイレクトやパイプを使用して入力ソース以外の場所に出力を書き込むことができます。
その上、あるだけでなくただ合意、3つの標準I/Oストリームも基準。たとえば、参照してください。標準I/OストリームセクションPOSIX 標準のシステムインタフェース部分です。
このセクションの理論的根拠説明する:
ISO C規格は、プログラムの開始時にstdinを読み取ることができ、stdoutとstderrを書き込むことができますが、この保証はプログラムが実行されている状況によって異なります(ISO CおよびPOSIX規格によって提供されるすべての保証も同様です)。要件を満たす環境で実行してください。読み取り用に開かれていないファイル記述子0または書き込み用に開かれていないファイル記述子1、2を使用して実行されるプログラムは、要件を満たさない環境で実行されます。アプリケーション作成者は、ファイル記述子0が読み取り用に開かれていないか、ファイル記述子1または2が書き込み用に開かれていないと一致する標準ユーティリティーまたはアプリケーションを実行しないように警告されます。