Por que o diretório raiz '/' tem uma referência ao seu “pai”?

6

Atualmente, estou desenvolvendo um sistema de arquivos falso para um navegador de jogos. Eu recentemente implementado ".." e "." pastas para que cada pasta tenha uma referência a seu pai. Então eu chequei no meu terminal se "/" também tem essas pastas. Na verdade fiquei muito surpreso por ter um diretório ".." que obviamente é uma referência para si mesmo.

O motivo dessa consistência ou uma explicação melhor?

Editar: Estou basicamente procurando o documento onde isso está documentado.

    
por Julian Hollmann 28.08.2014 / 12:55

4 respostas

3

Existe esta definição POSIX :

3.144 Empty Directory

A directory that contains, at most, directory entries for dot and dot-dot, and has exactly one link to it (other than its own dot entry, if one exists), in dot-dot.

Esta definição é repetida com frases diferentes nas descrições POSIX de todos os comandos de arquivo.
Por exemplo, para rmdir :

The definition of an empty directory is one that contains, at most, directory entries for dot and dot-dot.

Esta definição convoluta acima para um Diretório Vazio está aparentemente por trás desta convenção engraçada, e seu propósito é evitar quaisquer exceções à regra, nem mesmo para slash (/).

    
por 30.08.2014 / 20:59
5

A Especificação Única do UNIX declara:

As a special case, in the root directory, dot-dot may refer to the root directory itself.

Nenhuma razão é indicada no padrão. Para um oficial "por quê?" resposta, você pode precisar perguntar Ken Thompson diretamente.

    
por 30.08.2014 / 13:29
3

Passagem do sistema de arquivos.

Quando você está vendo um nome de arquivo nos sistemas Unix, você está olhando para uma árvore com raiz.

Quando você está olhando para um arquivo, ele está em um diretório. Você pode perguntar a esse diretório o que é, subindo um nível (..) e verificando o inode do diretório em que está. Você repete e pode construir onde está. Mas quando você alcança a raiz, não existe. Só existe "aqui". Definindo '.' e '..' para o mesmo valor, você define um sinal único que nenhum outro diretório nesse sistema de arquivos pode ter. É a raiz.

Quando você monta um sistema de arquivos em outro ponto de montagem - você tem um sistema de arquivos / home em outro disco, por exemplo, você substitui o '..' por uma referência ao ponto de montagem no sistema de arquivos raiz. Então a raiz do sistema de arquivos montado que costumava ter um '.' e '..' que eram os mesmos, agora têm valores diferentes.

Ter '.' e '..' repetir os mesmos dados é um sinal importante e único, verdadeiro apenas para o topo da árvore. E isso diz aos programas de passagem que podem parar de procurar por nós pai.

Acho que há documentação tangencial no Comentários do Lions para o kernel do Unix versão 6 . Em torno de página 84, onde descreve como o ponto de montagem é tratado.

    
por 02.09.2014 / 17:15
1

Eu gosto das outras respostas dadas, e gostaria de acrescentar que parte do que faz isso faz sentido (para mim, pelo menos) é que os diretórios são, de fato, tipos especiais de arquivos. Qualquer tipo de arquivo "especial" no UNIX exigiu atributos que o tornam em conformidade com sua classificação de tipo "especial". Sem TODOS esses atributos, o sistema pode não reconhecê-lo pelo que deve ser ou pode interpretá-lo incorretamente. Você pode ver um diretório como um arquivo usando, digamos, vim. Se você olhar para praticamente qualquer diretório em seu sistema com o vim, por exemplo,

$ vim ~

você verá que a primeira coisa descomentada listada nesse "arquivo" é "../", isto é, a primeira coisa listada neste arquivo especial é o diretório pai, e como você espera, seu pai é um nível "acima". Mas se você tentar

$ vim /

você verá na primeira linha não comentada que diz "./" em vez de "../". Por que a diferença e por que tem que estar aqui? "/" tem que ter um "pai" listado para estar em conformidade com os requisitos de ser reconhecido como um arquivo especial do tipo "diretório". Sem essa listagem primeiro, seria como se "/" tivesse um pai diferente especificado (ou seja, o que veio primeiro no arquivo especial "/"), e eu suspeito (mas não confirmei) que isso causaria um de seus filhos para ser interpretado como seu pai, criando uma circularidade no sistema de arquivos, ou seja, ele não seria mais um sistema de arquivos enraizado, mas sim um sistema circular! Em outras palavras, se o sistema sempre interpretar a primeira entrada em um "arquivo de diretório" como "pai deste diretório", então "/" deve ter uma listagem apropriada para ser interpretada corretamente.

    
por 03.09.2014 / 07:31