(Hmm: o seguinte agora é um pouco épico ...)
O design do diretório em sistemas de arquivos unix (que, para ser pedante, geralmente é, mas não necessariamente, anexado a sistemas operacionais unix) representa uma visão maravilhosa, que na verdade reduz o número de casos especiais necessários.
Um 'diretório' é realmente apenas um arquivo no sistema de arquivos. Todo o conteúdo real dos arquivos no sistema de arquivos está em inodes (da sua pergunta, posso ver que você já está ciente de algumas dessas coisas). Não há estrutura para os inodes no disco - eles são apenas um monte de blobs numerados de bytes, espalhados como manteiga de amendoim sobre o disco. Isso não é útil e, na verdade, é repulsivo para qualquer pessoa com um pingo de arrumação.
O único inode especial é o inode número 2 (não 0 ou 1, por razões de tradição); inode 2 é um arquivo de diretório: o diretório raiz . Quando o sistema monta o sistema de arquivos, ele 'sabe' que precisa ler o inode 2 para começar.
Um arquivo de diretório é apenas um arquivo, com uma estrutura interna que deve ser lida por opendir (3) e amigos. Você pode ver sua estrutura interna documentada na dir (5) (dependendo do seu SO); se você olhar para isso, verá que a entrada do arquivo de diretório quase não contém informações sobre o arquivo - isso é tudo no inode do arquivo. Uma das poucas coisas especiais sobre esse arquivo é que a função open (2) receberá um erro se você tentar abrir um arquivo de diretório com um modo que permita a gravação. Vários outros comandos (para escolher apenas um exemplo hexdump
) se recusam a agir da maneira normal com os arquivos de diretório, apenas porque provavelmente não é isso que você deseja fazer (mas esse é o caso especial deles, não o do sistema de arquivos).
Um link físico nada mais é do que uma entrada no mapa de um arquivo de diretório. Você pode ter duas (ou mais) entradas nesse mapa que mapeiam para o mesmo número de inode: esse inode, portanto, possui dois (ou mais) links físicos. Isso também explica por que cada arquivo tem pelo menos um 'link físico'. O inode possui uma contagem de referência, que registra quantas vezes esse inode é mencionado em um arquivo de diretório em algum lugar do sistema de arquivos (este é o número que você vê quando faz isso ls -l
).
OK: estamos chegando ao ponto agora.
O arquivo de diretório é um mapa de cadeias ('nomes de arquivos') para números (números de inode). Esses números de inode são os números dos inodes dos arquivos que estão 'nesse diretório'. Os arquivos que estão 'dentro' desse diretório podem incluir outros arquivos de diretório, portanto, seus números de inode estarão entre os listados no diretório. Portanto, se você tiver um arquivo /tmp/foo/bar
, o arquivo de diretório foo
incluirá uma entrada para bar
, mapeando essa sequência para o inode desse arquivo. Há também uma entrada no arquivo de diretório /tmp
, para o arquivo de diretório foo
que está 'dentro' do diretório /tmp
.
Quando você cria um diretório com mkdir (2), essa função
- cria um arquivo de diretório (com algum número de inode) com a estrutura interna correta,
- adiciona uma entrada ao diretório pai, mapeando o nome do novo diretório para esse novo inode (que é responsável por um dos links),
- adiciona uma entrada ao novo diretório, mapeando a sequência '.' para o mesmo inode (isso representa o outro link) e
- adiciona outra entrada ao novo diretório, mapeando a string '..' para o inode do arquivo de diretório modificado na etapa (2) (isso explica o maior número de links físicos que você verá nos arquivos de diretório que contêm subdiretórios )
O resultado final é que (quase) os únicos casos especiais são:
- A função open (2) tenta dificultar o tiro no pé, impedindo a abertura de arquivos de diretório para gravação.
- A função mkdir (2) facilita e facilita as coisas adicionando algumas entradas extras ('.' E '..') ao novo arquivo de diretório, apenas para facilitar a movimentação pelo sistema de arquivos. Eu suspeito que o sistema de arquivos funcionaria perfeitamente bem sem '.' e '..', mas seria uma dor de se usar.
- O arquivo de diretório é um dos poucos tipos de arquivos que são sinalizados como 'especiais' - isso é realmente o que diz que coisas como open (2) se comportam de maneira um pouco diferente. Veja
st_mode
em stat (2).
(copiado da pergunta original stackoverflow, 20/10/2011)
..
hardlinks, o seu software de caminhada em árvore já precisa ter uma exceção "não segue ciclos no link do diretório pai" , portanto, há pouca complexidade adicional também, exceto o.
link.