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.