Il riferimento al numero di errore dall'ultima specifica POSIX (POSIX.1-2008) indica:
[EISDIR]
È una directory. Tentativo di aprire una directory con la modalità di scrittura specificata.
Ciò significa che, su un sistema operativo compatibile con POSIX, dovresti essere in grado di leggere () una directory se l'hai aperta in sola lettura (O_RDONLY).
Ho appena provato questo su un NetBSD (a cui interessa davvero POSIX) e funziona come previsto, mentre non funziona su GNU / Linux con EISDIR (cosa che non dovrebbe accadere).
Una rapida occhiata a Linux mostra che è previsto ( 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;
}
Mentre un'implementazione concreta del filesystem può sovrascriverla (come fa CEPH: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), il comportamento predefinito è di restituire EISDIR ogni volta che qualcuno sta provando a read () una directory, anche se è aperta in sola lettura.
Ho fatto risalire questa modifica a 2.0.xe, almeno per il filesystem ext2, era ancora così.
Quindi, sì, su un sistema operativo compatibile con POSIX dovresti essere in grado di leggere una directory, ma alcuni kernel (come Linux e, apparentemente, altri) semplicemente ignorano questa condizione e infrangono lo standard.