1

質問があります。慣例により、UNIX はすべてのプロセスの stdin、stdout、stderr にファイル記述子 0、1、2 を関連付けます。たとえば stdin が指すファイルは、異なるプロセスで共有されていますか? 共有されている場合、2 つのシェルを開いてこれら 2 つのシェルに入力を入力すると、OS は共有ファイルをどのように管理するのでしょうか?

4

1 に答える 1

4

概要

記述子テーブルはプロセスごとであるため、システム内のすべてのプロセスが、すべての記述子テーブル スロットで異なるファイルを開くことができます。

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

しかし、プロセスが fork(2) すると、親と子の記述子は同じファイル テーブル エントリを指すため、ファイル内の 1 つの位置を共有します。これにより、Unix プロセスは状況を意識することなく、入力ストリームへのアクセスを共有できます。

3 つのテーブル

ファイルへのアクセスは、Unix の 3 つの重要なテーブルを介してチェーンされています。記述子テーブルはプロセスごとであり、ファイル テーブルを指します。ファイル テーブルは、開いているファイル テーブルと考えてください。実際のファイルへのアクセスを管理する3 番目のテーブルがあり、元々は inode テーブルと呼ばれていました。

認識すべき重要な点は、1 つのファイルの inode テーブルに複数のエントリが存在することはありませんが、ファイル テーブルには複数のエントリがある場合とない場合があるということです。ファイル記述子が open(2) で作成された場合、inode は新しいファイル テーブル エントリを取得しますが、fork(2) で作成された場合、同じファイル テーブル エントリが再利用され、読み取りポインタと書き込みポインタが共有されます。

それで、2つのシェル...

入力用の 2 つの異なるウィンドウを持つ 2 つのシェル、または異なるスクリプトを実行する 2 つのシェルの場合、それらはまったく同じファイルを使用していません。または、同じスクリプトの場合は、2 回開かれたため、それらの位置は独立しています。どちらも各プロセス内のファイル記述子「0」である可能性がありますが、それはすべてのプロセスが独自の記述子テーブルを持っているためです。

于 2010-09-28T20:35:53.590 に答える