私が持っていると言うプロセス1そして工程2。どちらも整数4に対応するファイル記述子を持ちます。
ただし、各プロセスでは、ファイル記述子4はカーネルのオープンファイルテーブルにあるまったく異なるファイルを指します。
どうやってこれができますか?ファイルディスクリプタは、開かれたファイルテーブルのレコードへのインデックスでなければなりませんか?
答え1
ファイル記述子(例4
)では、プロセス固有の索引です。ファイル記述子テーブル、いいえ開かれたファイルのテーブルです。ファイル記述子エントリ自体含むカーネルのグローバルオープンファイルテーブル内のエントリのインデックスとファイル記述子フラグ。
答え2
各プロセスには独自のファイル記述子テーブルがあります。プロセス1234のファイル記述子4は、プロセス1234のテーブルの内部を指す。プロセス5678のファイル記述子4は、プロセス5678の表の内部を指します。 1つの重要なことは、各プロセスの標準入力、標準出力、標準エラーであるファイル記述子0、1、2がリダイレクトされる場所を指すことです。
プロセスは同じファイルを複数回開くことができます。たとえば、プロセスの標準出力と標準エラーが同じ端末または同じファイルにリダイレクトされる場合、これは同時に発生する可能性があります。デフォルトのファイルテーブルエントリ(例:Linuxstruct file
)はファイルに関する情報以上の情報を伝え、オープンモード(読み取りまたは書き込みなど)およびその他の状態(実行時に閉じるなどのフラグなど)も含みます。たとえば、プロセスは、ファイル記述子 0 でのみ読み取るために端末を開き、ファイル記述子 2 でのみ書き込むために同じ端末を開くことができます。ファイルテーブルエントリには、ファイル内のプロセスの場所も含まれています。プロセスはlseek
同じファイル内の2つの異なる場所にアクセスしようとする可能性があるため、dup
ファイルへの2つのハンドルを取得します。
答え3
各プロセスには独自のファイル記述子テーブルがあります。それはすべてです。
これはすべてよく説明されています。UNIXネットワークプログラミング詳しく知りたい場合は、Richard Stevensの作品を読んでください。
答え4
各ファイル記述子がローカルファイル記述子テーブルに索引付けされる理由を視覚化するには、次の状況を見てください。リダイレクトUnixシステムでは。プロセスは標準出力を別のファイルにリダイレクトし、「1」の意味を別のプロセスに変更することなくプロセスのファイル記述子「1」を再ロードできます。 stdinとstderrも同様です。したがって、この動作をサポートするにはローカルファイル記述子が必要です。