
ソフト リンクとハード リンクがファイルへのポインターである場合。
ファイル記述子は、開いているファイルを指すファイル ハンドルです。
では、どちらもファイルへの一種のポインタである場合、この 2 つの違いは正確には何でしょうか。
また、ハード リンクはファイル コンテンツのアドレス位置を指し、ファイル記述子もファイル コンテンツを指すので、ここでは正確に何が違うのでしょうか。また、ハード リンクには独自のファイル記述子がありますか。
答え1
哲学的には、それらは違いがないと主張することもできる。
しかし、それらが使用され実装される理由、場所、方法はまったく異なります。
まず、ハード リンクとソフト/シンボリック リンクはどちらもディレクトリ エントリです。つまり、ディレクトリと呼ばれる特別にフォーマットされたファイル内のエントリ/レコードです。各レコードには名前と inode 番号が保持されます。inode 番号は、ファイルのメタデータ (アクセス許可、サイズなど) とデータ ブロックのリストを保持する実際の構造を指します。この構造は「inode」と呼ばれます。
ハードリンクとシンボリックリンクの違いは、ハードリンクが指すinodeには実際のデータが含まれているのに対し、シンボリックリンクが指すinodeには別のファイルへのパスが含まれていることです。基本的に、シンボリックリンクはそれ自体が難しい名前付きパイプ、UNIX ドメイン ソケット ファイルなどの特別な種類のファイルを指すリンク。
さて、カーネルがファイルを開くと、ディスクの inode を複製し、同じメタデータ (権限、データを含むブロックのリスト、サイズなど) の一部を含むメモリ内構造が作成されます。この構造は、「オープン ファイル記述」と呼ばれる別の構造によってポイントされます (位置ポインタ、ファイルが読み取り/書き込みモードまたは読み取り専用モードで開かれたかどうか、非ブロッキング モードで読み取りおよび書き込みを行う必要があるかどうかなど、さまざまな情報を保持します)。最後に、この構造は、ファイル記述子テーブルと呼ばれる配列/テーブルである別のカーネル (プロセスごと) 構造のエントリによってポイントされます。
open(2) のようなシステムコールによって返される整数である「ファイル記述子」は、このテーブルへのインデックスです。
メモリ内の inode は、複数の「オープン ファイル記述」によってポイントされる可能性があり、それ自体は、複数のプロセスからの複数のファイル記述子によってポイントされる可能性があります。
open(2) のような一部のシステム コールは、シンボリック リンクを特別に扱います。つまり、開いているファイルがシンボリック リンクであることが判明すると、その内容であるパスで指定されたファイルを開こうとします。
ディスク構造 (ディレクトリ、i ノード) とカーネル/メモリ構造 (i ノード、開いているファイルの説明) はどちらも、どちらがどちらを使用しているかを追跡するために参照カウントを使用しています。 (カーネルには、メモリ内またはディスク上のポインタをジャンプして、どのオブジェクトが他の場所から参照されなくなったかを判断するマーク アンド スイープ ガベージ コレクターはありません ;-))。