Quando os diretórios deixaram de ser legíveis como arquivos?

29

Eu tenho a 1ª edição do livro The Unix Programming Environment. No capítulo 2, os autores declaram que os diretórios são legíveis como arquivos e mencionam alguns fatos sobre o formato desses arquivos. Eles dão alguns exemplos de uso, como cat .(no exercício 2-2).

Pelo menos em Darwin, os diretórios não são mais legíveis como arquivos. Pelo menos, eles parecem arquivos de tamanho zero quando lidos.

Quando essa mudança ocorreu e existe alguma documentação oficial sobre isso?

Tyler
fonte
1
Lembro-me de ter trabalhado algum tempo 1991sep-1995jun em sun solaris. Eu acho que parou de funcionar para mim em algum lugar nesse período também. Quando atualizamos para máquinas sparc com sistema V. (não me lembro bem). Provavelmente depende do sistema de arquivos. Se o sistema de arquivos não armazenar os dados exatamente como descrito, ele será interrompido, a menos que uma camada de compatibilidade seja adicionada. Também não funciona hoje usando o Debian Gnu + Linux.
Ctrl-alt-delor 6/09/14
1
Eu sei que a leitura de um diretório como um arquivo funcionou no Unix System V no final dos anos 80 - início dos anos 90. Funcionou sob o SunOS. Funcionou sob algumas versões do Irix. Eu acho que acessar o sistema de arquivos virtual e permitir muitas organizações de disco subjacentes significa que você não pode realmente dar suporte a isso com eficiência.
9788 Bruce Ediger #
8
Mais informações (não autoritativas) podem ser encontradas aqui: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh
Eu verifiquei no AIX e Solaris - na verdade, no AIX você ainda pode, cat .enquanto no Solaris 11 (como no Linux), não pode. Legal.
gena2x

Respostas:

13

A referência do número de erro da última especificação POSIX (POSIX.1-2008) indica:

[EISDIR]

É um diretório. Foi feita uma tentativa de abrir um diretório com o modo de gravação especificado.

Isso significa que, em um sistema operacional compatível com POSIX, você poderá ler () um diretório se o tiver aberto apenas para leitura (O_RDONLY).

Eu apenas tentei isso em uma caixa do NetBSD (que realmente se preocupa com o POSIX) e funciona como esperado, enquanto falha no GNU / Linux com EISDIR (o que não deveria acontecer).

Uma rápida olhada no Linux mostra que isso é pretendido ( http://lxr.free-electrons.com/source/fs/libfs.c#L189 ):

ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t *ppos)
{
        return -EISDIR;
}

Embora uma implementação concreta do sistema de arquivos possa substituí-la (como o CEPH faz: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), o comportamento padrão é retornar o EISDIR sempre que alguém estiver tentando read () um diretório, mesmo que seja somente leitura aberta.

Rastreei essa alteração até a versão 2.0.xe, pelo menos para o sistema de arquivos ext2, esse ainda era o caso.

Portanto, sim, em um sistema operacional compatível com POSIX, você poderá ler um diretório, mas alguns kernels (como Linux e, aparentemente, outros) simplesmente ignoram essa condição e quebram os padrões.

Sergio L. Pascual
fonte
6
De acordo com o Open Group, o comportamento do Linux aqui é legal sob uma extensão XSI do padrão . readdir(2)é mais portátil. Isso me sugere que a resposta correta para a pergunta do OP é "Quando o XSI se tornou popular".
Kevin