Por que '/' tem uma entrada '..'?

76

Isso sempre me intrigou. Por que o diretório raiz contém uma referência a um diretório pai?

bob@bob:/$ ls -a
.     build  home            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

Eu entendo como os diretórios são gerenciados no sistema de arquivos - cada diretório possui n + 2 ponteiros para si mesmo (n = número de subdiretórios dentro do diretório). Um para cada subdiretório imediato, um para seu pai e um para si mesmo.

Mas o que é o pai de / ?

    
por Nathan Osman 12.01.2011 / 03:14

2 respostas

71

/.. pontos para / :

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

Ambos possuem o mesmo número de inode, que é 2 neste sistema. (O valor exato não importa.)

É feito por consistência. Dessa forma, não precisa haver código no kernel para verificar onde ele está quando processa um .. em um caminho. Você pode dizer cd .. forever e nunca ir mais fundo que a raiz.

    
por 12.01.2011 / 03:28
34

Está lá porque é uma garantia feita pelo Unix: cada diretório contém duas entradas, . , que se refere a si mesmo, e .. , que se refere ao pai.

O diretório raiz do namespace atual é especial, em que .. aponta para a mesma coisa que . , mas não tão especial para quebrar a garantia feita pelo SO para os programas. Quando esses contratos são quebrados, as coisas dão errado e todos apontam os dedos.

O diretório raiz que você vê pode, no sistema de arquivos no disco, ter um diretório pai diferente. A exibição dos sistemas de arquivos fornecidos no namespace montado é o que aplica a regra .. = . para / . Portanto, se você estiver em chroot() jail, verá /.. = / , mesmo que alguém fora da prisão, que esteja vendo /path/to/jail/.. , veja /path/to .

    
por 13.01.2011 / 04:25