Quand les répertoires ont-ils cessé d'être lisibles en tant que fichiers?

29

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 en tant que fichiers et mentionnent certains faits concernant le format de ces fichiers. Ils donnent des 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 lors de la lecture.

Quand ce changement s'est-il produit et existe-t-il une documentation officielle à ce sujet?

Tyler
la source
1
Je me souviens qu'il fonctionnait quelque temps 1991sep-1995jun sur le soleil solaris. Je pense que cela a cessé de fonctionner pour moi quelque part au cours de cette période. Lorsque nous sommes passés à des machines sparc avec le système V. (je ne me souviens pas trop). Cela dépend probablement du système de fichiers. Si le système de fichiers ne stocke pas les données exactement comme décrit, il se cassera sauf si une couche de compatibilité est ajoutée. Ne fonctionne pas non plus aujourd'hui avec Debian Gnu + Linux.
ctrl-alt-delor
1
Je sais que la lecture d'un répertoire en tant que fichier a fonctionné sous Unix System V à la fin des années 80 - début des années 90. Cela fonctionnait sous SunOS. Cela a fonctionné sous certaines versions d'Irix. Je pense que passer au système de fichiers virtuel et autoriser de nombreuses organisations de disques sous-jacentes signifie que vous ne pouvez pas vraiment prendre cela en charge efficacement.
Bruce Ediger
8
Plus d'informations (sans autorité) peuvent être trouvées ici: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh
J'ai vérifié sur AIX et Solaris - en effet, sur AIX, vous pouvez toujours cat .sur Solaris 11 (comme sous Linux), vous ne pouvez pas. Cool.
gena2x

Réponses:

13

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.

Sergio L. Pascual
la source
6
Selon l'Open Group, le comportement de Linux ici est légal sous une extension XSI à la norme . readdir(2)est plus portable. Cela me suggère que la bonne réponse à la question d'OP est "Quand XSI est devenu populaire."
Kevin