Linux のいわゆる「標準ストリーム」は、stdin、stdout、stderr です。これらが「標準」と呼ばれるのには理由があります。非標準ストリームはありますか? それらの非標準ストリームは、カーネルによって根本的に異なる方法で処理されますか?
答え1
この文脈では、「ストリーム」はプロセス内で開かれているファイルです。(「ストリーム」という単語には、ここでは関係のない他の意味がある場合もあります。)
3 つの標準ストリームは、プログラムの起動時に既に開いているはずです。ファイル記述子 0 は、プログラムがユーザー入力またはデフォルトのデータ入力を読み取る場所であるため、標準入力と呼ばれます。ファイル記述子 1 は、プログラムが通常のデータ出力を書き込む場所であるため、標準出力と呼ばれます。ファイル記述子 2 は、プログラムがエラー メッセージを書き込む場所であるため、標準エラーと呼ばれます。
その他のファイル記述子番号は、事前に割り当てられた役割がないため、標準ではありません。最終的には、プログラムが望むものに使用されることになります。したがって、プログラムによって開かれたファイルを「非標準ストリーム」と呼ぶこともできますが、奇妙で混乱を招くことになります。「stdin、stdout、stderr 以外のファイルを開く」には実際には名前は必要ありませんし、「非標準ストリーム」は、特別な種類のファイルまたは非標準の方法で開かれたファイルのように聞こえますが、実際はそうではありません。
ファイル記述子 0 ~ 2 の従来の役割は、標準ライブラリと特定のプログラムによって付与されます。たとえば、コンソール ログイン プログラムと端末エミュレーターは、これらのファイル記述子で端末を開いた状態でシェル (または他のプログラム) を起動します。C 標準ライブラリは、FILE*
これらの 3 つの標準記述子のオブジェクト (C ではストリームと呼ばれます) を作成します。カーネルでは特別な処理は行われません。
答え2
カーネルはすべてのファイル記述子を同じように扱います。ファイル記述子 0 を入力 (stdin) として使用し、ファイル記述子 1 を出力 (stdout) として使用し、ファイル記述子 2 (stderr) にエラーを出力するプロセスを持つことは、単なる慣例です。
端末が起動すると、疑似 tty が作成され、ファイル記述子 0、1、2 に割り当てられた入力/出力を持つシェルが起動されます。プログラムがこの規則を使用しない場合は、入力や出力を適切にリダイレクトする必要があります。