なぜ」。 'Unixのハードリンク?

なぜ」。 'Unixのハードリンク?

私はUnixベースのオペレーティングシステムで空のディレクトリのリンク数が1ではなく2である理由について多くの説明をしました。みんな「。」だからと言いましたね。それぞれ自身を指すディレクトリ。 「.」という概念が相対パスを指定するのに役立つ理由は理解していますが、それをファイルシステムレベルで実装すると何が得られますか?パスを取るシェルやシステムコールにパスを解釈する方法を教えてください。

「..」は実際のリンクであり、私にとってより意味があります。ファイルシステムは、親ディレクトリに移動するために親ディレクトリへのポインタを保存する必要があります。しかし、なぜそうなのか理解できません。 '真のリンクになることが必要です。これも実装時に醜い特殊事例につながるようです。リンク数が 1 より小さい inode で使用する空き領域だけを確保できると考えることができますが、ディレクトリの場合は実際にリンク数が少ないことを確認する必要があります。 2より。なぜ一貫性がないのですか?

ベストアンサー1

本当に興味深い質問です。一見すると、次のような利点があります。

.まず、「」は、シェルまたはシステムコールを介して現在のディレクトリとして解釈できることを指定します。ただし、ディレクトリにドット入力を使用すると、事実上これらの必要性が消え、低レベルで一貫性が維持されます。

しかし、私はこれがこのデザイン決定の基本的なアイデアだとは思いません。

ディレクトリからファイルが作成または削除されると、ディレクトリの修正タイムスタンプも更新する必要があります。このタイムスタンプは対応するインデックスノードに保存されます。 inode 番号は対応するディレクトリエントリに保存されます。

もしドットエントリは存在せず、ルーチンはそのディレクトリエントリからinode番号の親ディレクトリを検索する必要があり、これにより別のディレクトリ検索が発生します。

しかし、幸いなことに、現在のディレクトリにいくつかの項目があります。現在のディレクトリにファイルを追加または削除するルーチンは、単に最初のエントリ(通常はドットエントリがある場所)に戻り、すぐに現在のディレクトリのinode番号を見つけます。

ポイント入力には3番目の利点があります。

破損したファイルシステムを調べて、fsck利用可能なリストにもない未接続ブロックを処理する必要があるときに、データブロック(ディレクトリリストとして解釈されたとき)にinodeを指すポイントエントリがあるかどうかを簡単に確認できます。順番にデータブロックを指します。その場合、データブロックは失われたディレクトリと見なされ、再接続する必要があります。

おすすめ記事