1. ホーム
  2. linux

[解決済み】stdin, stdout, stderrについて混乱していませんか?

2022-04-01 11:57:41

質問

この3つのファイルの目的がよくわからないのですが。私の理解が正しければ stdin は、プログラムがプロセス内のタスクを実行するために、そのリクエストに書き込むファイルです。 stdout は、カーネルが出力を書き込み、要求したプロセスがその情報にアクセスするためのファイルであり stderr は、すべての例外が入力されるファイルです。これらのファイルを開いて実際に発生するかどうか調べてみたが、それを示唆するようなものは何もなかった。

私が知りたいのは、これらのファイルの目的は一体何なのかということです。技術的な専門用語はほとんど使わず、絶対にダンマリで答えてください

解決方法は?

標準入力 - これは ファイルハンドル というように、プロセスが情報を取得するために読み取るものです。

標準出力 - あなたのプロセスは、このファイルハンドルに従来の出力を書き込みます。

標準エラー - あなたのプロセスは、このファイルハンドルに診断出力を書き込みます。

このくらいで、もういいや:-)

もちろん、そのほとんどは慣習によるものです。もしあなたが望むなら、診断情報を標準出力に書き出すことを止めるものは何もありません。3つのファイルハンドルを完全に閉じて、自分のファイルをI/O用にオープンすることもできます。

プロセスが起動したとき、すでにこれらのハンドルが開かれているはずで、そこから読んだり、書き込んだりするだけでよいのです。

デフォルトでは、おそらく端末デバイスに接続されています(例. /dev/tty しかし、シェルでは、プロセスの開始前に、これらのハンドルと特定のファイルやデバイス(あるいは他のプロセスへのパイプライン)との接続を設定することができます(可能な操作のいくつかはかなり賢いものです)。

例として挙げられるのは

my_prog <inputfile 2>errorfile | grep XYZ

ということになります。

  • のプロセスを作成します。 my_prog .
  • オープン inputfile を標準入力(ファイルハンドル0)とします。
  • 開く errorfile を標準エラーとします(ファイルハンドル2)。
  • 作成 もう一つ のプロセスです。 grep .
  • の標準出力をアタッチします。 my_prog の標準入力に grep .

コメントについて

devフォルダーにあるこれらのファイルを開くと、プロセスが実行されている出力が表示されないのはなぜですか?

それは、通常のファイルではないからです。UNIXでは すべて ファイルシステムのどこかにあるファイルだからといって、最下層がそうであるとは限らない。のほとんどのファイルは /dev 階層はキャラクタデバイスまたはブロックデバイスであり、事実上デバイスドライバです。デバイスにはサイズはありませんが、メジャーとマイナーのデバイス番号があります。

それらを開くと、物理的なファイルではなくデバイスドライバに接続され、デバイスドライバは賢いので、別々のプロセスは別々に処理されるべきであると知っています。

同じことは、Linuxの /proc ファイルシステムです。これらは実際のファイルではなく、カーネル情報へのゲートウェイとして厳重に管理されているだけです。