標準入力に書き込まないのはなぜですか?

標準入力に書き込まないのはなぜですか?

~によるとこの回答、、、およびはすべて最初に同じ場所(と同じ)に接続されており、合計stdinを読み書きする規則は次のとおりです。stdoutstderr/dev/ttystdinstdoutstderr

それでは、なぜ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が書き込み用に開かれていないと一致する標準ユーティリティーまたはアプリケーションを実行しないように警告されます。

関連情報