La référence du numéro d'erreur de la dernière spécification POSIX (POSIX.1-2008) indique:
[EISDIR]
Est un directeur. Une tentative a été effectuée pour ouvrir un répertoire avec le mode d'écriture spécifié.
Cela signifie que, sur un système d'exploitation compatible POSIX, vous devriez pouvoir lire () un répertoire si vous l'avez ouvert en lecture seule (O_RDONLY).
Je viens d'essayer cela sur une boîte NetBSD (qui se soucie vraiment de POSIX) et fonctionne comme prévu, alors qu'il échoue sur GNU / Linux avec EISDIR (ce qui ne devrait pas se produire).
Un rapide coup d'œil à Linux montre que cela est prévu ( 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;
}
Alors qu'une implémentation concrète d'un système de fichiers peut la remplacer (comme le fait le CEPH: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), le comportement par défaut est de renvoyer EISDIR chaque fois que quelqu'un essaie de read () un répertoire, même s'il est ouvert en lecture seule.
J'ai retracé ce changement jusqu'à 2.0.x, et au moins pour le système de fichiers ext2, c'était toujours le cas.
Donc, oui, sur un système d'exploitation compatible POSIX, vous devriez pouvoir lire un répertoire, mais certains noyaux (comme Linux et, apparemment, d'autres) ignorent simplement cette condition et enfreignent la norme.