私が持っていると言うプロセス1およびプロセス2を。両方とも整数4に対応するファイル記述子を持っています。
ただし、各プロセスでは、ファイル記述子4はカーネルのオープンファイルテーブル内のまったく異なるファイルを指します。
そんなことがあるものか?ファイル記述子は、Open File Tableのレコードへのインデックスであると想定されていませんか?
私が持っていると言うプロセス1およびプロセス2を。両方とも整数4に対応するファイル記述子を持っています。
ただし、各プロセスでは、ファイル記述子4はカーネルのオープンファイルテーブル内のまったく異なるファイルを指します。
そんなことがあるものか?ファイル記述子は、Open File Tableのレコードへのインデックスであると想定されていませんか?
回答:
各プロセスには、独自のファイル記述子テーブルがあります。プロセス1234のファイル記述子4は、プロセス1234のテーブル内を指します。プロセス5678のファイル記述子4は、プロセス5678のテーブル内を指します。慣れ親しんでおく必要があるのは、ファイル記述子0、1、および2です。これらは、プロセスごとに標準入力、標準出力、および標準エラーであり、これらのリダイレクト先を指します。
プロセスは、同じファイルを複数回開くことができます。これは、たとえば、プロセスの標準出力と標準エラーが同じ端末または同じファイルにリダイレクトされる場合に、偶然に発生する可能性があります。基礎となるファイルテーブルエントリ(Linuxなどstruct file
)は、ファイルに関する情報以上のものを保持しています。また、オープンモード(読み取りまたは書き込みなど)およびその他の状態(フラグなど、execの終了など)も含まれます。たとえば、プロセスは、ファイル記述子0でのみ読み取り用に開かれた端末と、ファイル記述子2でのみ書き込み用に開かれた同じ端末を持っている場合があります。プロセスはlseek
、同じファイル内の2つの異なる位置に移動する場合dup
があるため、そのファイルに対する2つのハンドルを取得するために使用します。
dup
それはブリキに書かれていることとまったく同じです。結果の記述子は両方とも同じファイルテーブルエントリを指し、したがって同じオフセットを共有します。2つの異なるファイルテーブルエントリを取得するにopen
は、ファイルを2回作成する必要があると確信しています。
各プロセスには、独自のファイル記述子テーブルがあります。それで全部です。
深く学びたい場合は、Richard StevensによるUNIX Network Programmingですべて非常によく説明されています。
余分なレベルの間接参照は問題を解決しませんか?(「コンピュータープログラミングのすべての問題は、余分なレベルの間接参照によって解決できます」-賢明な灰色のひげ)。つまり、各プロセスの小さな整数は、「ファイルテーブルを開く」へのカーネル空間インデックスのプロセスごとの配列へのインデックスになります。
4
、両方のプロセスのfd は、それ自身の開いているfdの数に相対的です。Fd0-2
(stdin、stdout、sdterr)は常に新しいプロセス用に開かれ、番号はそのプロセスだけに予約されていません。