ファイルは、標準入力ファイルディスクリプタによって異なるプロセスのために同じファイルを指していますか?

StackOverflow https://stackoverflow.com/questions/3816774

  •  26-09-2019
  •  | 
  •  

質問

私は心の中で質問があります。慣例により、UNIXは、すべてのプロセス上のファイルSTDIN、STDOUTの記述子0、1、2、標準エラー出力を関連付けます。ファイルには、例えば、あります別のプロセスによって共有、標準入力が指しますか?共有する場合は、我々はこれらの2つのシェルにいくつかの入力を入力するために2つのシェルを開いたときに、どのようにOSが共有ファイルを管理するためにしているのですか?

役に立ちましたか?

解決

概要

それはすべての記述子テーブルスロットに異なるファイルのオープンを持ってするには、システムのすべてのプロセスのために可能ですので、

はディスクリプタ・テーブルには、プロセスごとのです。

しかし、実際にはもう少し複雑です。同じファイルを2つのプロセスが独立したファイルを開いて、その後、彼らはそれぞれ独自の読み取りと書き込みのポインタを含むファイルへの完全に別のアクセスを、持っている、と彼らは両方の書き込みのみに相互作用するかの場合ます。

しかし、ときに、プロセスのフォーク(2)の場合、親と子の記述子が同じファイル・テーブル・エントリを指す、と彼らは、ファイル内の単一の位置を共有するようにします。これは、状況を意識する必要がなく、入力ストリームへの共有アクセスにUnixのプロセスを可能にします。

の3つのテーブル

はファイルへのアクセスは、UNIXでの三つの重要なテーブルを通じて連鎖しています。 の記述子テーブルのは、プロセスごとのおよびポイントであるのファイルテーブルにの。 のオープンファイルテーブルとしてのファイルテーブルを考えます。もともとと呼ばれる第3のテーブルには、あります。のinodeテーブルの実際のファイルへのアクセスを管理

実現するために重要なことは、いずれかのファイルのinodeテーブル内の複数のエントリは決してありませんしながら、またはファイルテーブル内の複数のエントリがあってもなくてもよいということです。ファイルディスクリプタは(2)のオープンを使用して作成されている場合は、iノードは、新しいファイルテーブルエントリを取得しますが、それはフォーク(2)で作成されていますならば、同じファイル・テーブル・エントリが再利用され、読み出しおよび書き込みポインタが共有されています。

だから、2つのシェル...

タイピングのための2つの異なるウィンドウ、または別のスクリプトを実行している2つのシェルを持つ2つのシェルの場合には、それらはすべてで同じファイルを使用していない、またはそれは同じスクリプトだ場合、その位置があるので、それが二回開かれました独立しました。どちらも、それぞれのプロセス内のファイルディスクリプタ「0」であってもよいが、すべてのプロセスは、独自の記述子テーブルを持っているためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top