あなたの理解は完全に逆行しているのではないかと思います。:)
「標準入力」、「標準出力」、および「標準エラー」は、カーネルの観点からではなく、プログラムの観点から考えてください。
プログラムが出力を印刷する必要がある場合、通常は「標準出力」で印刷されます。プログラムは通常、出力を標準出力に出力しprintf
ます。これは標準出力にのみ出力します。
プログラムがエラー情報を出力する必要がある場合(必ずしも例外ではありません。これらはプログラミング言語の構成であり、はるかに高いレベルで課せられます)、通常は「標準エラー」で出力されます。これは通常fprintf
、印刷時に使用するファイルストリームを受け入れるで実行されます。ファイルストリームは、書き込み用に開かれた任意のファイル(標準出力、標準エラー、またはまたはで開かれたその他のファイル)である可能性がありfopen
ますfdopen
。
「標準入力」は、ファイルが入力を読み取る必要がある場合、またはfread
、、またはを使用する場合に使用されます。fgets
getchar
これらのファイルはいずれも、次のようにシェルから簡単にリダイレクトできます。
cat /etc/passwd > /tmp/out # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err # redirect cat's standard error to /tmp/error
cat < /etc/passwd # redirect cat's standard input to /etc/passwd
または、エンチラーダ全体:
cat < /etc/passwd > /tmp/out 2> /tmp/err
2つの重要な注意事項があります。1つは、「標準入力」、「標準出力」、および「標準エラー」は単なる慣例です。これらは非常に強力な規則ですが、このようなプログラムを実行できることは非常に素晴らしいことです。grep echo /etc/services | awk '{print $2;}' | sort
各プログラムの標準出力をパイプラインの次のプログラムの標準入力に接続します。
次に、ファイルストリーム(FILE *
オブジェクト)を操作するための標準のISO C関数を指定しました。カーネルレベルでは、すべてのファイル記述子(int
ファイルテーブルへの参照)と、およびなどのはるかに低レベルの操作ですが、そうread
でwrite
はありません。 ISOC関数の幸せなバッファリングを行います。私はそれをシンプルに保ち、より簡単な機能を使用することを考えましたが、同じようにあなたは代替案を知っているべきだと思いました。:)