2016-03-23 8 views
1

Stdinとstdoutは、複数のプロセスがユーザーから入力を受け取るために共有する単一のファイルです。それでOSは、特定のプログラムに与えられた入力だけが、プログラムよりも標準で見えることをどうやって確認しますか?すべてのプロセス間で共有されている標準入力/標準出力(同じ論理名を持ちながら)stdinとstdoutはプロセスとどのようにユニークになっていますか?

答えて

3

あなた仮定はせいぜい間違っです。

stdin/stdoutは、特定のプロセスを開始したプロセスによって転送される(または初期化される)オープンファイルの論理名です。実際には、標準のfork-and-execパターンでは、これらの設定は、execが呼び出される前に、新しいプロセス(のフォークの後)ですでに発生している可能性があります。

stdin/stdoutは通常、親から継承されます。したがって、ある特定のファイル番号に対してstdinおよび/またはstdoutを共有するプロセスグループが存在します。
また、ファイル記述子がパイプの側面である可能性があるため、ファイルシステム(またはデバイスノード)からのファイルを既知の標準チャネルにリンクする必要はありません(考慮事項にはstderrも含める必要があります)。セットアップの

通常の方法は次のとおりです。

  • 親(例えばシェル)fork
  • フォークプロセス(子)を呼び出している環境、標準I/Oチャネルと何かを設定しています。
  • この場合、子プロセスはexecを実行して、実行するターゲットイメージにプロセスをオーバーレイします。

セットアップ時には、既存のチャンネルを維持するか、新しいチャンネルに置き換えます。 pipeを作成し、エンドポイントを適切にリンクします。この方法

(つまり単純化の説明ではフォーク前に発生する必要があるパイプを作成し、正直に言うと)、プロセスのほとんどは、独自のI/Oチャネルを持っています。

それにも関わらず、複数のプロセスは、それらが(への有効なファイル記述子を持っている)に接続されているチャネルに書き込むことができます。各ジャンクのデータを読むとき(通常、端末またはファイルを含むブロックを含む行)は、単一のリーダーだけが読み取っています。あなたは、いくつかの(ランニング)を持っているのであれば標準入力などの端末からの読み込み処理(S)他は全くタイピングは表示されませんが、一つだけは、あなたの入力を読み込みます。

関連する問題