La referencia del número de error de la última especificación POSIX (POSIX.1-2008) establece:
[EISDIR]
Es un directorio. Se intentó abrir un directorio con el modo de escritura especificado.
Esto significa que, en un sistema operativo compatible con POSIX, debería poder leer () un directorio si lo abrió solo lectura (O_RDONLY).
Acabo de probar esto en un cuadro de NetBSD (que realmente se preocupa por POSIX), y funciona como se esperaba, mientras falla en GNU / Linux con EISDIR (lo que no debería suceder).
Un vistazo rápido a Linux muestra que esto está destinado ( 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;
}
Si bien una implementación concreta del sistema de archivos puede anularlo (como lo hace CEPH: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), el comportamiento predeterminado es devolver EISDIR cada vez que alguien intenta leer () un directorio, incluso si está abierto solo lectura.
He rastreado este cambio hasta 2.0.x, y al menos para el sistema de archivos ext2, este seguía siendo el caso.
Entonces, sí, en un sistema operativo compatible con POSIX, debería poder leer un directorio, pero algunos núcleos (como Linux y, aparentemente, otros) simplemente ignoran esta condición y rompen el estándar.