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.