GNU/Linux >> Tutoriels Linux >  >> Linux

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

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.


Linux
  1. Trouver les plus gros fichiers ou répertoires ?

  2. Lorsque les fichiers exécutables ne le sont pas ?

  3. Comment ignorer les répertoires/fichiers dans Subversion ?

  4. Déplacer les fichiers vers des répertoires basés sur l'extension

  5. fichiers cp uniquement, répertoires ignorés

Rechercher la commande sous Linux (Rechercher des fichiers et des répertoires)

Comment renommer des fichiers et des répertoires sous Linux

Commande Ls sous Linux (liste des fichiers et des répertoires)

Comment compresser des fichiers et des répertoires sous Linux

Compresser et archiver des fichiers et des répertoires

Trouvez facilement des fichiers et des répertoires sur Linux