¿Se elimina un directorio cuando su número de enlaces duros se convierte en 0?


10

¿Se elimina un directorio cuando su número de enlaces duros se convierte en 0?

Un directorio siempre tiene al menos 2 como número de enlaces duros, debido a .. Cuando se rm -rtrata de un directorio, ¿disminuye el número de enlaces duros de 2 a 0 en 2 en lugar de 1?

¿Puede la cantidad de enlaces duros de un directorio ser alguna vez 1?

Gracias.

Respuestas:


9

En primer lugar, no todos los sistemas de archivos usan .y ..como enlaces duros. Esto está documentado en el manual de búsqueda de GNU. Voy a ignorar esos sistemas de archivos para el resto de mi respuesta porque no fueron diseñados para Unix y solo complican las cosas sin agregar claridad. También voy a ignorar el directorio raíz y los puntos de montaje por la misma razón.

el número de enlaces a un directorio nunca es menor que dos debido a .y ... El número de subdirectorios es igual al número de enlaces menos dos. Debido a esto, no puede vincular o desvincular un directorio, también lo rm -rhará statun archivo antes de eliminarlo y utilizarlo en rmdirlugar de hacerlo unlinken directorios. Las dos llamadas al sistema utilizan rutas de código completamente diferentes en el núcleo.


Gracias. Un directorio tiene un enlace rígido .., solo cuando tiene un subdirectorio, ¿correcto? Entonces, ..no siempre está presente para un directorio, ¿verdad?
Tim

..está presente en cada directorio que es un subdirectorio. que es todo pero /que también tiene uno, así que todos los directorios.
hildred

1
(1) Si un directorio no tiene subdirección, el directorio no tiene un enlace rígido ..consigo mismo. ¿Cuáles son los enlaces duros al directorio? el archivo con el nombre de ruta y .? (2) ¿por qué ignoras los puntos de montaje?
Tim

Si el directorio es un subdirectorio. la entrada ..apuntará al padre. Como caso especial, el enlace del directorio raíz apunta a sí mismo. Esto permite que cd ..\..comandos similares funcionen como se espera, sin importar dónde se encuentre. Puedes probar con el statcomando.
BillThor

1
Tienes razón en que el recuento de enlaces nunca es inferior a 2, pero no es por eso ... Es por .y el nombre en el directorio principal que apunta a él. La única excepción es la raíz, que no tiene padre. Pero se ..apunta a sí mismo, por lo que también tiene un recuento de enlaces = 2.
Barmar

11

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 rmdirllamada 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 unlinkllamada 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 rmcomando, por cierto, evitó que incluso root elimine directorios. Y rm -rllamaría al rmdircomando para eliminar directorios después de vaciar sus contenidos.

En estos sistemas históricos, el mal uso de la unlinkllamada de un programa que se ejecuta como root, que se ejecuta en una condición de carrera con rmdiro 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 fsckya 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 statpuede 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.


2
strcpya una matriz de tamaño fijo en un ejecutable setuid ... ¡estos fueron buenos tiempos!
Andrea Corbellini

@AndreaCorbellini En realidad, hay un exploit publicado mkdirbasado en el hecho de que tiene que hacer lo mismo a la inversa.
Random832


preguntando rmdir, ¿no eliminaría ..eliminar el directorio padre?
Edward Torvalds

@edwardtorvalds No, me refería a la eliminación del enlace ".." en sí, no al directorio principal al que apunta.
Random832
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.