Cualquier archivo en un sistema de archivos UNIX diseñado convencionalmente cuyo recuento de referencia (por ejemplo, la suma del recuento de enlaces duros y el número de identificadores de archivos abiertos *) alcanza 0 se elimina. Sin embargo, en los sistemas UNIX modernos, la rmdir
llamada al sistema elimina un directorio vacío en una sola operación en lugar de quitar .
y ..
de uno en uno.
Sin embargo, en sistemas UNIX históricos, esta llamada al sistema no existía. En cambio, el rmdir
comando era un programa setuid (el código fuente se puede encontrar aquí ) que verificó que un directorio estaba vacío (aparte de las entradas especiales), y luego se eliminó ..
y .
, en ese orden, y luego eliminó el directorio en sí, todo con el unlink
llamada al sistema que solo se permitió usar root en los directorios (de ahí por qué el comando se configuró). Entonces, en esos sistemas, el recuento de enlaces de un directorio sería momentáneamente 1 después de que .
se eliminó, pero antes de que el directorio se eliminara del directorio padre, entonces sería 0.
El rm
comando, por cierto, evitó que incluso root elimine directorios. Y rm -r
llamaría al rmdir
comando para eliminar directorios después de vaciar sus contenidos.
En estos sistemas históricos, el mal uso de la unlink
llamada de un programa que se ejecuta como root, que se ejecuta en una condición de carrera con rmdir
o mv
, o que crea un archivo en un proceso cuyo directorio actual ha sido eliminado (los sistemas modernos evitan esto), podría dar lugar a archivos o directorios colgantes que tienen un recuento de enlaces duros por encima de 0 pero no existen en el árbol de directorios. Esta condición fue detectada por dcheck
, y todavía es una de las comprobaciones fsck
ya que sigue siendo físicamente posible en la mayoría de los sistemas de archivos.
Por cierto, no se requiere que los sistemas de archivos implementen directorios (incluidos .
y ..
) como archivos normales que tienen enlaces duros. En estos sistemas de archivos, el recuento de enlaces duros de un directorio siempre se informará como 0
(pero, por supuesto, su existencia dentro del directorio principal califica para un "recuento de referencia" de 1).
El comportamiento de un directorio eliminado (por ejemplo, cuando es examinado por un proceso que ya lo tiene abierto o como su directorio actual) y el significado exacto del "conteo de enlaces" de un directorio no están especificados. En Mac OS X, por ejemplo, informará un recuento de enlaces duros de 2 , aunque no tenga enlaces duros reales. A pesar de que .
y ..
no aparecen en el listado, el directorio se puede abrir y stat
puede ser llamado con el nombre .
o ..
. En Linux, el número de enlaces es 0, pero .
y ..
también siguen siendo trabajo.
Mac OS X también informa el número de todos los archivos en un directorio como el recuento de enlaces, en lugar de solo el número de subdirectorios. Pero es 2 incluso cuando .
y ..
se han ido.
* Esto incluye descriptores abiertos normales, secciones mapeadas en memoria (incluyendo, por ejemplo, la ejecución de archivos binarios y bibliotecas compartidas) y procesar directorios actuales.
..
, solo cuando tiene un subdirectorio, ¿correcto? Entonces,..
no siempre está presente para un directorio, ¿verdad?