Como um diretório é um “tipo especial de arquivo”?

20

Estou lendo este tutorial do Unix e me deparei com essa citação ...

We should note here that a directory is merely a special type of file.

... mas nenhuma explicação ou detalhes são fornecidos. Como é realmente um diretório apenas um arquivo?

    
por gwg 20.04.2015 / 18:55

6 respostas

15

Muitas entidades em sistemas operacionais de estilo * nix (e outros) são consideradas arquivos ou têm um aspecto semelhante a um arquivo de definição, mesmo que não sejam necessariamente uma seqüência de bytes armazenados em um sistema de arquivos. Exatamente como os diretórios são implementados depende do tipo de sistema de arquivos, mas geralmente o que eles contêm, considerado como uma lista, é uma seqüência de bytes armazenados, então nesse sentido eles não são tão especiais.

Uma maneira de definir o que um "arquivo" está em um contexto * nix é que ele é algo que tem um arquivo descritor associado a ele. De acordo com o artigo da wikipedia, um descritor de arquivo

is an abstract indicator used to access a file or other input/output resource, such as a pipe or network connection...

Em outras palavras, eles se referem a vários tipos de recursos de / para os quais uma seqüência de bytes pode ser lida / gravada, embora a origem / destino dessa sequência não seja especificada. Em outras palavras, o "onde" do recurso poderia ser qualquer coisa. O que define é que é um canal de informação. Isso é parte do porque às vezes é dito que no unix "tudo é um arquivo". Você não deve aceitar isso literalmente, mas vale a pena considerar seriamente. No caso de um diretório, essas informações pertencem ao que está no diretório e, em um nível de implementação mais baixo, como encontrá-lo no sistema de arquivos.

Os diretórios são um pouco especiais nesse sentido, porque no código C nativo eles não são ostensivamente associados a um descritor de arquivo; a API POSIX usa um tipo especial de identificador de fluxo, DIR* . No entanto, esse tipo de fato tem um descritor subjacente que pode ser recuperado . Os descritores são gerenciados pelo kernel e acessá-los sempre envolve chamadas do sistema, portanto, outro aspecto do que um descritor é é que é um canal controlado pelo kernel do sistema operacional. Eles têm números únicos (por processo) começando com 0, que geralmente é o descritor do fluxo padrão .

    
por 20.04.2015 / 19:19
13

No modo Unix de fazer as coisas: tudo é um arquivo.

Um diretório é um (de muitos) tipo de arquivo especial. Não contém dados. Em vez disso, ele contém ponteiros para todos os arquivos contidos no diretório.

Outros tipos de arquivos especiais:

  • links
  • soquetes
  • dispositivos

Mas como eles são considerados "arquivos", você pode ls , renomeá-los e movê-los e, dependendo do tipo de arquivo especial, enviar dados para / deles.

    
por 20.04.2015 / 19:08
10

Minha resposta é mera reminiscência, mas em Unix 199x vintage, dos quais havia muitos, os diretórios eram arquivos, apenas marcados como "diretório" em algum lugar do inode em disco.

Você pode abrir um diretório com algo como open(".", O_RDONLY) e recuperar um descritor de arquivo utilizável. Você poderia analisar o conteúdo se você vasculhou /usr/include e encontrou a definição C struct correta. Eu sei que fiz isso para sistemas SunOS 4.1.x, o sistema de arquivos EFS da SGI e as estações de trabalho Mips-CPU do DEC para um sistema de arquivos, provavelmente BSD4.2 FFS.

Essa foi uma experiência ruim. A padronização em uma camada de sistema de arquivos virtual é uma boa coisa para portabilidade, mesmo que os diretórios não sejam mais arquivos restritos. As camadas VFS nos permitem experimentar sistemas de arquivos nos quais diretórios não são arquivos, como ReiserFS ou NFS.

    
por 20.04.2015 / 21:25
3

Um diretório é especial porque possui o 'd' em seu modo, dizendo ao sistema de arquivos que ele deve interpretar seu conteúdo como uma lista de outros arquivos contidos no diretório, em vez de um arquivo regular que é apenas uma seqüência de arquivos. bytes a serem lidos pelo aplicativo. Isso é tudo.

    
por 21.04.2015 / 00:53
2

Os diretórios são arquivos porque os sistemas linux empregam o universal i / o model . No modelo, tudo no sistema é um arquivo e pode ser acessado com as mesmas chamadas de sistema e vários comandos.

Eles são de tipo especial porque seus i-nodes possuem a marca para o tipo de arquivo e têm uma estrutura especial de serem uma tabela de nomes de arquivos e links para outros i-nodes. Esses pares de nome de arquivo-link, também conhecidos como "hardlinks", no nó i de um diretório, enumeram os arquivos "dentro" do diretório.

Diretórios são apenas para organizar arquivos. Quando um arquivo é "movido" de um diretório para outro, o próprio arquivo não é realocado no disco. É apenas que uma entrada em um diretório i-nodes é removida e gravada em outro nó i-diretório.

    
por 22.04.2015 / 06:36
-3

A resposta aceita não está completamente correta. nos sistemas POSIX, os "Inodes" apontam para arquivos e diretórios. Os descritores de arquivo são exclusivos de um processo e não de um sistema. No entanto, os inodes são únicos, embora mais de um inode possa apontar para um único arquivo. Teria comentado a resposta aceita, mas não poderia devido à restrição do representante.

    
por 15.02.2018 / 00:45