(うーん、次はちょっとした叙事詩です...)
UNIXファイルシステム上のディレクトリの設計(これは通常、UNIX OSに接続されますが、必ずしも必要ではありません)は素晴らしい洞察を表しており、実際に必要な特別なケースの数を減らします。
「ディレクトリ」は、実際にはファイルシステム内の単なるファイルです。ファイルシステム内のファイルの実際の内容はすべてiノードにあります(質問から、このようなもののいくつかを既に知っていることがわかります)。ディスク上のiノードには構造がありません。ディスク上のピーナッツバターのように広がっている、番号付きの大きな塊の単なる塊です。これは有用ではありません。そして、きちんと片付けられた人には本当に忌避です。
唯一の特殊なiノードは、(伝統の理由のためではない0または1)iノード番号2です。inode 2はディレクトリファイルです:ルートディレクトリ。システムがファイルシステムをマウントすると、iノード2をreaddirして起動する必要があることを「認識」します。
ディレクトリファイルは単なるファイルであり、opendir(3)や友人が読むことを目的とした内部構造を持っています。dir(5)に文書化された内部構造を見ることができます(OSによって異なります)。これを見ると、ディレクトリファイルエントリにファイルに関する情報がほとんど含まれていないことがわかります。これはすべてファイルiノードにあります。このファイルについて特別な数少ないことの1つは、書き込みを許可するモードでディレクトリファイルを開こうとすると、open(2)関数がエラーを与えることです。他のさまざまなコマンド(1つの例を選択hexdump
するため)は、ディレクトリファイルに対して通常の方法で動作することを拒否します。これは、おそらくそれがやりたいことではないからです(ただし、ファイルシステムではなく、特殊なケースです)。
ハードリンクはディレクトリファイルのマップ内のエントリよりも何よりも少ないです。このようなマップには、同じiノード番号にマップする2つ(またはそれ以上)のエントリを含めることができます。したがって、そのiノードには2つ(またはそれ以上)のハードリンクがあります。また、すべてのファイルに少なくとも1つの「ハードリンク」がある理由も説明します。iノードには参照カウントがあり、ファイルシステム内のディレクトリファイルでそのiノードが言及されている回数を記録します(これは、実行時に表示される数値ですls -l
)。
OK:これでポイントになりました。
ディレクトリファイルは、文字列(「ファイル名」)から数字(inode番号)へのマップです。これらのiノード番号は、そのディレクトリ内にあるファイルのiノードの番号です。そのディレクトリ内にあるファイルには、他のディレクトリファイルが含まれている可能性があるため、それらのiノード番号はディレクトリにリストされているものの中に含まれます。したがって、ファイル/tmp/foo/bar
がある場合、ディレクトリファイルにfoo
はのエントリが含まれ、bar
その文字列をそのファイルのiノードにマッピングします。ディレクトリファイル/tmp
には、ディレクトリ内にfoo
あるディレクトリファイルのエントリもあります/tmp
。
mkdir(2)でディレクトリを作成すると、その機能
- 正しい内部構造を持つディレクトリファイル(iノード番号付き)を作成します。
- 親ディレクトリにエントリを追加し、新しいディレクトリの名前をこの新しいiノード(リンクの1つを占める)にマッピングします。
- 新しいディレクトリにエントリを追加し、文字列「。」をマッピングします 同じiノード(これは他のリンクを説明します)
- 新しいディレクトリに別のエントリを追加し、文字列「..」を手順(2)で変更したディレクトリファイルのinodeにマッピングします(これは、サブディレクトリを含むディレクトリファイルに表示される多数のハードリンクを説明します)。
最終結果は、(ほとんど)唯一の特別な場合です:
- open(2)関数は、書き込みのためにディレクトリファイルを開かないようにすることで、自分自身を足で撃つことを困難にします。
- mkdir(2)関数は、新しいディレクトリファイルにいくつかの追加エントリ(「。」および「..」)を追加することにより、物事を簡単かつ簡単にします。これは、純粋にファイルシステム内を移動できるようにするためです。「。」がなくてもファイルシステムは完璧に機能すると思います。および「..」ですが、使用するのは面倒です。
- ディレクトリファイルは、「特別」としてフラグが付けられる数少ないタイプのファイルの1つです。これは、実際にopen(2)のようなものにわずかに異なる動作をさせるものです。
st_mode
stat(2)を参照してください。
(stackoverflowの元の質問、2011年10月20日からコピー)
..
、あなたのツリーウォーキング・ソフトウェアがすでに持っている必要がありますハードリンク「親ディレクトリリンクのない次のサイクル」それは少し除いても複雑に追加されるので、例外を.
リンク。