Tout fichier sur un système de fichiers UNIX conventionnellement conçu dont le nombre de références (par exemple la somme du nombre de liens fixes et le nombre de descripteurs de fichiers ouverts *) atteint 0 est supprimé. Cependant, sur les systèmes UNIX modernes, l' rmdir
appel système supprime un répertoire vide en une seule opération plutôt que de le supprimer .
et ..
un par un.
Dans les systèmes UNIX historiques, cependant, cet appel système n'existait pas. Au lieu de cela, la rmdir
commande était un programme setuid ( le code source peut être trouvé ici ) qui vérifiait qu'un répertoire était vide (autre que les entrées spéciales), puis supprimé ..
et .
, dans cet ordre, puis supprimé le répertoire lui-même, le tout avec le unlink
appel système que seul root était autorisé à utiliser sur les répertoires (d'où la raison pour laquelle la commande était setuid). Ainsi, sur ces systèmes, le nombre de liens d'un répertoire serait momentanément 1 après avoir .
été supprimé, mais avant que le répertoire ne soit supprimé du répertoire parent, il serait alors de 0.
La rm
commande, par ailleurs, a empêché même root de supprimer des répertoires. Et rm -r
appeler la rmdir
commande pour supprimer les répertoires après avoir vidé leur contenu.
Sur ces systèmes historiques, une mauvaise utilisation de l' unlink
appel à partir d'un programme s'exécutant en tant que root, l'exécution dans une condition de concurrence critique avec rmdir
ou mv
, ou la création d'un fichier dans un processus dont le répertoire actuel a été supprimé (les systèmes modernes empêchent cela), pourrait entraîner des problèmes de fichiers ou de répertoires qui ont un nombre de liens fixes supérieur à 0 mais qui n'existent pas dans l'arborescence des répertoires. Cette condition a été détectée par dcheck
, et est toujours l'une des vérifications, fsck
car elle reste physiquement possible sur la plupart des systèmes de fichiers.
Les systèmes de fichiers ne sont d'ailleurs pas nécessaires pour implémenter les répertoires (y compris .
et ..
) en tant que fichiers normaux qui ont des liens physiques. Sur ces systèmes de fichiers, le nombre de liens physiques d'un répertoire sera toujours signalé comme 0
(mais bien sûr, son existence dans le répertoire parent donne droit à un "nombre de références" de 1).
Le comportement d'un répertoire supprimé (par exemple lorsqu'il est examiné par un processus qui l'a déjà ouvert ou l'a comme répertoire actuel) et la signification exacte du "nombre de liens" d'un répertoire ne sont pas spécifiés. Sur Mac OS X, par exemple, il signalera un nombre de liens durs de 2 , même s'il n'a pas de vrais liens durs. Même si .
et ..
n'apparaissent pas dans la liste, le répertoire peut être ouvert et stat
peut être appelé avec le nom .
ou ..
. Sous Linux, le nombre de liens est 0 mais .
et ..
même encore du travail.
Mac OS X signale également le nombre de tous les fichiers d'un répertoire comme nombre de liens, au lieu du nombre de sous-répertoires. Mais c'est 2 même quand .
et ..
sont partis.
* Cela inclut les descripteurs ouverts normaux, les sections mappées en mémoire (y compris par exemple l'exécution de binaires et de bibliothèques partagées) et le traitement des répertoires actuels.
..
, uniquement lorsqu'il a un sous-répertoire, n'est-ce pas? N'est..
-ce pas toujours présent pour un répertoire, non?