ソフトリンクとハードリンクの両方がファイルへのポインタである場合。
ファイル記述子は、開いたファイルを指すファイルハンドルです。
どちらもファイルへのポインタである場合、それらの間の違いは正確に何ですか?
さらに、ハードリンクはファイル内容のアドレス位置を指し、ファイル記述子もファイル内容を指すというのですが、ここでの違いは何ですか?ハードリンクには独自のファイル記述子があります。
ベストアンサー1
哲学的には変わらないと言えます。
しかし、なぜ、どこで、どのように使用され実装されるのかはまったく異なります。
まず、ハードリンクとソフト/シンボルリンクの両方がディレクトリエントリです。つまり、これらはディレクトリと呼ばれる特別にフォーマットされたファイルのエントリ/レコードです。ここで、各レコードは名前と inode 番号を保持します。後者は実際の構造の保存を参照します。礼拝の規則。ファイルのメタデータ(権限、サイズなど)とデータブロックのリスト - 「inode」という構造。
ハードリンクとシンボリックリンクの違いは、ハードリンクは実際のデータを含むinodeを指すのに対して、シンボリックリンクは他のファイルへのパスを含むinodeを指すことです。デフォルトでは、シンボリックリンク自体は次のようになります。硬い名前付きパイプ、Unixドメインソケットファイルなどの特別な種類のファイルへのリンク。
カーネルはファイルを開くとメモリ内構造を作成し、ディスクからinodeをコピーし、同じメタデータ(権限、データを含むブロックのリスト、サイズなど)の一部を含みます。この構造は、「オープンファイル記述」と呼ばれる別の構造によって指定されます(位置ポインタ、ファイルが読み取り/書き込みモードで開かれているか読み取り専用モードで開かれているか、非ブロックモードで読み書きが必要かどうかなど)情報を保持します)。 、等。 )。最後に、この構造は、ファイル記述子テーブルと呼ばれる配列/テーブルである別のカーネル(プロセス別)構造のエントリによって指定されます。
「ファイル記述子」(open(2)などのシステムコールによって返される整数)は、このテーブルのインデックスです。
メモリ内のinodeは、複数のプロセスの複数のファイル記述子が指すことがある複数の「開かれたファイル記述」と指すことがあります。
いくつかのシステムコール(たとえば、open(2))はシンボリックリンクを特別に扱います。開いているファイルがシンボリックリンクであることがわかった場合は、コンテンツパスで指定されたファイルを開こうとします。
ディスク構造(ディレクトリ、inode)とカーネル/メモリ構造(inode、オープンファイルの説明)の両方が参照計算を使用して、どの構造がどの構造を使用しているかを追跡します。 (いいえ、カーネルには、どのオブジェクトが他の場所で参照されなくなったかを確認するためにメモリまたはディスクへのポインタをジャンプするインジケータとクリーニングガベージコレクタはありません;-))。