ディレクトリnewDirectoryを作成してからls -ldコマンドを実行するとします。ハードリンクの数は2です。最初からハードリンク2を作成する正確な理由は何ですか?また、現在のディレクトリ内のサブディレクトリの数は、ハードリンクの数-2に等しくなりますか?
ディレクトリnewDirectoryを作成してからls -ldコマンドを実行するとします。ハードリンクの数は2です。最初からハードリンク2を作成する正確な理由は何ですか?また、現在のディレクトリ内のサブディレクトリの数は、ハードリンクの数-2に等しくなりますか?
回答:
歴史的に、最初のUnixファイルシステムはすべてのディレクトリに2つのエントリを作成.しました。ディレクトリ自体を..指し、その親を指します。これにより、アプリケーションとOS自体の両方について、ファイルシステムを簡単に走査できます。
したがって、各ディレクトリのリンク数は2 + nで、nはサブディレクトリの数です。リンクは、その親のディレクトリの.エントリ、ディレクトリ自体のエントリ、および..各サブディレクトリのエントリです。たとえば、これがをルートとするサブツリーのコンテンツであり/parent、すべてのディレクトリであるとします。
/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3
その後dir5のリンクカウントがありますdirのエントリ/parent、.のエントリ/parent/dir、および3つ..のそれぞれのエントリを/parent/dir/sub1、/parent/dir/sub2と/parent/dir/sub3。/parent/dir/sub1サブディレクトリがないため、リンクカウントは2(のsub1エントリ/parent/dirとの.エントリ/parent/dir/sub1)です。
「適切な」親を持たないルートディレクトリの特別なケースの量を最小限に抑えるために、ルートディレクトリには..それ自体を指すエントリが含まれています。この方法でも、リンクカウントは2にサブディレクトリの数を加えたものになり、2が/.と/..です。
その後、ファイルシステムは、メモリ内の親ディレクトリを追跡するために傾向があり、通常は必要ありません.し、..実際のエントリとして存在します。典型的な近代的なUNIXシステムでは、治療.および..ファイルシステムタイプに依存しないファイルシステムのコードの一部として特別な値として。いくつかのファイルシステムはまだ含ま.および..エントリ、または何もディスク上に表示されていないにもかかわらずにふり。
ほとんどのファイルシステムは.、..エントリが存在するかどうかに関係なく、ディレクトリのリンク数2 + nを報告しますが、例外があります。たとえば、btrfsはこれを行いません。
..親をポイントしても、現在のディレクトリのリンク数には影響しません。2のカウントは.、ディレクトリの(元の)名前自体からリストされます。あなたがそれを置く方法が少し曖昧であり、それは以下のように聞こえる.と..の2つです。..数学がどのように機能するかを説明するためにのみ使用する必要があります2+n:)
.です。「ディレクトリ自体に1つ、その中に1つあります。」それでも不明な場合は、これ以上明確にすることができません。私ができることは、ここにコメントで彼の答えをコピーして貼り付けることだけです。
ディレクトリ自体用とディレクトリ.内用があります。
また、現在のディレクトリ内のサブディレクトリの数は、ハードリンクの数-2に等しくなりますか?
各サブディレクトリは..ハードリンクを作成するため、これは理にかなっています。それを超えると、ディレクトリへのハードリンクを作成できません。1 しかし、私はこれを真剣なもの、特には信じません。サブディレクトリを数えて実際の数を取得するのは簡単だからです。
ただls何人の潜水艦がいるのかのアイデアのために出力を見ているなら、それはあなたにまともなアイデアを与えます。
1または、少なくとも、できませんln。私はプログラムで試みたことがなく、man 2 linkあいまいです。ディレクトリへのリンクに明らかなエラーはありませんが、適用される可能性のあるカップルがあります(EMLINK、EPERM)。そのため、ディレクトリへの唯一の可能なハードリンクが.and ..であると言う標準がどこかになければ、そのハードリンクカウントを単なる手がかりとして扱うだけです。