J'ai la 1ère édition du livre The Unix Programming Environment. Dans le chapitre 2, les auteurs déclarent que les répertoires sont lisibles comme des fichiers, et mentionnent quelques faits sur le format de ces fichiers. Ils donnent quelques exemples d'utilisation tels que cat .
(dans l'exercice 2-2).
Au moins dans Darwin, les répertoires ne sont plus lisibles en tant que fichiers. Au moins, ils semblent être des fichiers de longueur nulle lorsqu'ils sont lus.
Quand ce changement s'est-il produit et existe-t-il une documentation officielle à ce sujet ?
Réponse acceptée :
La référence du numéro d'erreur de la dernière spécification POSIX (POSIX.1-2008) indique :
[EISDIR]
Est un directeur. Tentative d'ouverture d'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 arriver).
Un rapide coup d'œil à Linux montre que c'est voulu (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 du système de fichiers peut le remplacer (comme le fait 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.