web-dev-qa-db-ja.com

「/」に「..」エントリがあるのはなぜですか?

これはいつも私を困惑させてきました。ルートディレクトリに親ディレクトリへの参照が含まれているのはなぜですか?

 bob @ bob:/ $ ls -a 
。 build lib32 mnt .rpmdb sys vmlinuz 
 .. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old 
 bin dev initrd.img.old lost + found proc selinux usr 
 boot etc lib media root srv var 

私はディレクトリがファイルシステムでどのように管理されるかを理解しています-各ディレクトリはそれ自体へのn + 2ポインタを持っています(n =ディレクトリ内のサブディレクトリの数)。 1つは直接のサブディレクトリごと、もう1つは親ディレクトリ、もう1つはそれ自体です。

しかし、/の親ですか?

81
Nathan Osman

/../を指します:

$ ls -id /
2 /
$ ls -id /..
2 /..

どちらのiノード番号も同じで、このシステムでは偶然2です。 (正確な値は関係ありません。)

一貫性を保つために行われます。このように、パス内の..を処理するときに現在の場所を確認するために、カーネル内にコードを配置する必要はありません。あなたはcd ..を永遠に言うことができ、ルートより深く行くことはできません。

72
Warren Young

これは、UNIXによる保証であるため、そこにあります。すべてのディレクトリには、自身を参照する_._と、親を参照する_.._の2つのエントリが含まれています。

現在のネームスペースのルートディレクトリは、_.._が_._と同じものを指すという点で特別ですが、OSがプログラムに対して行った保証を破ることはそれほど特別ではありません。それらの契約が破られたとき、物事はうまくいかず、誰もが指を指す。

表示されるルートディレクトリは、ディスク上のファイルシステムで、実際には別の親ディレクトリを持つ場合があります。マウントされた名前空間で提供されるファイルシステムのビューは、_.. = ._の_/_ルールを適用します。したがって、chroot()刑務所にいる場合は、刑務所の外にいる人が_/.. = /_を見ると、代わりに_/path/to/jail/.._が表示されますが、_/path/to_が表示されます。

38
Phil P