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

28

Eu tenho a 1ª edição do livro The Unix Programming Environment. No capítulo 2, os autores afirmam que os diretórios são legíveis como arquivos e mencionam alguns fatos sobre o formato desses arquivos. Eles fornecem 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 ser arquivos de comprimento zero quando lidos.

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

    
por Tyler 06.09.2014 / 20:59

1 resposta

12

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

[EISDIR]

Is a directory. An attempt was made to open a directory with write mode specified.

Isso significa que, em um SO compatível com POSIX, você deve ser capaz de ler () um diretório se você o abrir somente para leitura (O_RDONLY).

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

Uma rápida olhada no Linux mostra que isso é pretendido ( link ):

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í-lo (como o CEPH: link ), o comportamento padrão é retornar EISDIR sempre que alguém estiver tentando ler () um diretório, mesmo que esteja aberto somente para leitura.

Eu rastreei essa mudança de volta para 2.0.xe, pelo menos para o sistema de arquivos ext2, esse ainda era o caso.

Então, sim, em um SO compatível com POSIX você deve ser capaz de ler um diretório, mas alguns kernels (como o Linux e, aparentemente, outros) simplesmente ignoram essa condição e quebram o padrão.

    
por 17.09.2014 / 13:40