(Hmm: ce qui suit est maintenant un peu une épopée ...)
La conception du répertoire sur les systèmes de fichiers Unix (qui, pour être pédant, sont généralement, mais pas nécessairement, rattachés à des systèmes d’exploitation Unix) représente un excellent aperçu, qui réduit en réalité le nombre de cas spéciaux requis.
Un "répertoire" n'est en réalité qu'un fichier du système de fichiers. Tout le contenu réel des fichiers du système de fichiers est en inodes (d'après votre question, je constate que vous connaissez déjà certains de ces éléments). Les inodes sur le disque ne sont pas structurés - ils ne sont que de nombreux blocs d'octets numérotés, répartis comme du beurre d'arachide sur le disque. Ce n'est pas utile, et en effet est répugnant pour toute personne avec un soupçon d'esprit rangé.
Le seul inode spécial est l'inode numéro 2 (et non 0 ou 1, pour des raisons de tradition); inode 2 est un fichier de répertoire: le répertoire racine . Lorsque le système monte le système de fichiers, il "sait" qu'il doit lire l'inode 2 pour se lancer.
Un fichier de répertoire est juste un fichier, avec une structure interne destinée à être lue par opendir (3) et ses amis. Vous pouvez voir sa structure interne documentée dans dir (5) (selon votre système d'exploitation); Si vous regardez cela, vous verrez que l'entrée du fichier de répertoire ne contient presque aucune information sur le fichier - c'est tout dans l'inode du fichier. Une des rares particularités de ce fichier est que la fonction open (2) génère une erreur si vous essayez d'ouvrir un fichier de répertoire avec un mode permettant l'écriture. Diverses autres commandes (pour ne citer qu'un exemple hexdump
) refuseront d'agir normalement avec les fichiers de répertoires, simplement parce que ce n'est probablement pas ce que vous voulez faire (mais c'est leur cas particulier, pas le système de fichiers).
Un lien physique n'est ni plus ni moins qu'une entrée dans la carte d'un fichier de répertoire. Vous pouvez avoir deux entrées (ou plus) dans une telle carte qui correspondent toutes deux au même numéro d'inode: cet inode a donc deux (ou plus) liens physiques. Cela explique également pourquoi chaque fichier contient au moins un "lien dur". L'inode a un nombre de références, qui enregistre le nombre de fois où il est mentionné dans un fichier de répertoire quelque part dans le système de fichiers (il s'agit du nombre que vous voyez lorsque vous le faites ls -l
).
OK: nous arrivons au point maintenant.
Le fichier de répertoire est une carte de chaînes ("noms de fichiers") en nombres (numéros d'inode). Ces numéros d'inodes sont les numéros des inodes des fichiers qui sont 'dans' ce répertoire. Les fichiers qui sont 'dans' ce répertoire peuvent inclure d'autres fichiers de répertoire, ainsi leurs numéros d'inode figureront parmi ceux répertoriés dans le répertoire. Ainsi, si vous avez un fichier /tmp/foo/bar
, le fichier de répertoire foo
inclut une entrée pour bar
mapper cette chaîne sur l'inode de ce fichier. Il y a aussi une entrée dans le fichier de répertoire /tmp
, pour le fichier de répertoire foo
qui est 'dans' le répertoire /tmp
.
Lorsque vous créez un répertoire avec mkdir (2), cette fonction
- crée un fichier de répertoire (avec un certain numéro d'inode) avec la structure interne correcte,
- ajoute une entrée dans le répertoire parent, mappant le nom du nouveau répertoire sur ce nouvel inode (qui représente l'un des liens),
- ajoute une entrée au nouveau répertoire en mappant la chaîne '.' au même inode (cela représente l'autre lien), et
- ajoute une autre entrée dans le nouveau répertoire, en mappant la chaîne '..' avec l'inode du fichier de répertoire modifié à l'étape (2) (cela représente le plus grand nombre de liens physiques que vous verrez sur les fichiers de répertoires contenant des sous-répertoires )
Le résultat final est que (presque) les seuls cas spéciaux sont:
- La fonction open (2) essaie de rendre plus difficile de se tirer dans le pied en vous empêchant d'ouvrir des fichiers de répertoire pour l'écriture.
- La fonction mkdir (2) facilite les choses en ajoutant quelques entrées supplémentaires ('.' Et '..') au nouveau fichier de répertoire, uniquement pour faciliter le déplacement dans le système de fichiers. Je soupçonne que le système de fichiers fonctionnerait parfaitement bien sans '.' et '..', mais serait une douleur à utiliser.
- Le fichier de répertoire est l’un des rares types de fichiers marqués «spécial» - c’est vraiment ce qui dit que open (2) se comporte légèrement différemment. Voir
st_mode
dans stat (2).
(copie de la question d'origine de stackoverflow, 2011-10-20)
..
liens durs, votre logiciel de navigation dans l'arborescence doit déjà comporter une exception "ne suit pas les cycles sur le lien de répertoire parent" , ce qui en fait une complexité supplémentaire, à l'exception du.
lien également.