異なるプロセスの同じfdはどのようにして同じファイルを指すことができますか?


25

私が持っていると言うプロセス1およびプロセス2を。両方とも整数4に対応するファイル記述子を持っています。

ただし、各プロセスでは、ファイル記述子4はカーネルのオープンファイルテーブル内のまったく異なるファイルを指します。

ここに画像の説明を入力してください

そんなことがあるものか?ファイル記述子は、Open File Tableのレコードへのインデックスであると想定されていませんか?


1
良い質問!私の推測では、ファイル記述子は翻訳されているため4、両方のプロセスのfd は、それ自身の開いているfdの数に相対的です。Fd 0-2(stdin、stdout、sdterr)は常に新しいプロセス用に開かれ、番号はそのプロセスだけに予約されていません。


@ jw013これはなじみがあると思いました。\ @Pithikosこれはどのように重複していませんか?
マイケルMrozek

1
これは貧弱な図です。ファイル記述子4は、左側のファイル記述子テーブルの4番目のエントリ(5番目、ゼロからカウント)を意味し、「4」を含むエントリではないことを示す必要があります。実際の「4」は、数値を含むユーザースペース変数に存在します。他の質問の図ははるかに優れています。
Random832

2
@ Random832まあ、どの図が正しいかわかっていたら、おそらくこの質問をしたことはなかっただろう。
ピチコス14

回答:


35

ファイル記述子、つまり、この4例では、プロセス固有のファイル記述子テーブルへのインデックスであり、開いているファイルテーブルではありません。ファイル記述子エントリ自体に、カーネルのグローバルオープンファイルテーブル内のエントリへのインデックスとファイル記述子フラグが含まれています。


2
レコードについては、ほとんどのシステムに「ファイル記述子フラグ」が1つだけあり、close-on-execフラグがあります。他のすべての「per-fd」状態(オフセットおよびアクセスモードを含む)は、オープンファイルテーブルエントリの一部です。
Random832

24

各プロセスには、独自のファイル記述子テーブルがあります。プロセス1234のファイル記述子4は、プロセス1234のテーブル内を指します。プロセス5678のファイル記述子4は、プロセス5678のテーブル内を指します。慣れ親しんでおく必要があるのは、ファイル記述子0、1、および2です。これらは、プロセスごとに標準入力、標準出力、および標準エラーであり、これらのリダイレクト先を指します。

プロセスは、同じファイルを複数回開くことができます。これは、たとえば、プロセスの標準出力と標準エラーが同じ端末または同じファイルにリダイレクトされる場合に、偶然に発生する可能性があります。基礎となるファイルテーブルエントリ(Linuxなどstruct file)は、ファイルに関する情報以上のものを保持しています。また、オープンモード(読み取りまたは書き込みなど)およびその他の状態(フラグなど、execの終了など)も含まれます。たとえば、プロセスは、ファイル記述子0でのみ読み取り用に開かれた端末と、ファイル記述子2でのみ書き込み用に開かれた同じ端末を持っている場合があります。プロセスはlseek、同じファイル内の2つの異なる位置に移動する場合dupがあるため、そのファイルに対する2つのハンドルを取得するために使用します。


2
これは完全に正しいわけではありません。マニュアルページ/仕様によると、dupそれはブリキに書かれていることとまったく同じです。結果の記述子は両方とも同じファイルテーブルエントリを指し、したがって同じオフセットを共有します。2つの異なるファイルテーブルエントリを取得するにopenは、ファイルを2回作成する必要があると確信しています。
jw013

@Gilles「プロセス1234のファイル記述子4は、プロセス1234のテーブル内を指します」。どのテーブルを意味しますか?私が知っているのは、プロセス内の唯一のテーブルはファイル記述子テーブルであり、各レコードはカーネルの単一の Open File Tableを指します
ピチコス

より正確な説明については、unix.stackexchange.com / questions / 195057 /…を参照してください。
ジル「SO-悪であるのをやめる」


7

余分なレベルの間接参照は問題を解決しませんか?(「コンピュータープログラミングのすべての問題は、余分なレベルの間接参照によって解決できます」-賢明な灰色のひげ)。つまり、各プロセスの小さな整数は、「ファイルテーブルを開く」へのカーネル空間インデックスのプロセスごとの配列へのインデックスになります。


2
ソース 賢明な老いはデビッド・ウィーラー可能性があります。彼は「しかし、それは通常別の問題を引き起こすだろう」とも言ったようです。 :)
jw013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.