(Hmm: lo siguiente ahora es un poco épico ...)
El diseño del directorio en los sistemas de archivos de Unix (que, para ser pedantes, están típicamente pero no necesariamente unidos a sistemas operativos de Unix) representa una visión maravillosa, que en realidad reduce el número de casos especiales requeridos.
Un 'directorio' es realmente solo un archivo en el sistema de archivos. Todo el contenido real de los archivos en el sistema de archivos está en inodes (de su pregunta, puedo ver que ya está al tanto de algunas de estas cosas). Los inodos en el disco no tienen estructura: son solo un gran grupo de gotas numeradas de bytes, esparcidas como mantequilla de maní sobre el disco. Esto no es útil, y de hecho es repelente para cualquier persona con una pizca de mentalidad ordenada.
La única inode especial es inode número 2 (no 0 o 1, por razones de tradición); inode 2 es un archivo de directorio: el directorio raíz . Cuando el sistema monta el sistema de archivos, "sabe" que tiene que leer el inodo 2 para comenzar.
Un archivo de directorio es solo un archivo, con una estructura interna que debe ser leída por opendir (3) y sus amigos. Puede ver su estructura interna documentada en dir (5) (dependiendo de su sistema operativo); si observa eso, verá que la entrada del archivo de directorio casi no contiene información sobre el archivo, todo eso está en el inodo del archivo. Una de las pocas cosas que tiene de especial este archivo es que la función open (2) generará un error si intenta abrir un archivo de directorio con un modo que permita la escritura. Varios otros comandos (para elegir solo un ejemplo hexdump
) se negarán a actuar de la manera normal con los archivos de directorio, solo porque eso probablemente no sea lo que desea hacer (pero ese es su caso especial, no el del sistema de archivos).
Un enlace duro no es más ni menos que una entrada en el mapa de un archivo de directorio. Puede tener dos (o más) entradas en dicho mapa que se mapean al mismo número de inodo: ese inodo, por lo tanto, tiene dos (o más) enlaces duros. Esto también explica por qué cada archivo tiene al menos un 'enlace duro'. El inodo tiene un recuento de referencia, que registra cuántas veces ese inodo se menciona en un archivo de directorio en algún lugar del sistema de archivos (este es el número que ve cuando lo hace ls -l
).
OK: estamos llegando al punto ahora.
El archivo de directorio es un mapa de cadenas ('nombres de archivo') a números (números de inodo). Esos números de inodo son los números de los inodes de los archivos que están 'en' ese directorio. Los archivos que están 'en' ese directorio pueden incluir otros archivos de directorio, por lo que sus números de inodo estarán entre los enumerados en el directorio. Por lo tanto, si tiene un archivo /tmp/foo/bar
, el archivo de directorio foo
incluye una entrada para bar
asignar esa cadena al inodo para ese archivo. También hay una entrada en el archivo de directorio /tmp
, para el archivo de directorio foo
que está 'en' el directorio /tmp
.
Cuando crea un directorio con mkdir (2), esa función
- crea un archivo de directorio (con algún número de inodo) con la estructura interna correcta,
- agrega una entrada al directorio principal, asignando el nombre del nuevo directorio a este nuevo inodo (que representa uno de los enlaces),
- agrega una entrada al nuevo directorio, asignando la cadena '.' al mismo inodo (esto explica el otro enlace), y
- agrega otra entrada al nuevo directorio, asignando la cadena '..' al inodo del archivo de directorio que modificó en el paso (2) (esto explica la mayor cantidad de enlaces duros que verá en los archivos de directorio que contienen subdirectorios )
El resultado final es que (casi) los únicos casos especiales son:
- La función open (2) intenta dificultar que te dispares en el pie, evitando que abras archivos de directorio para escribir.
- La función mkdir (2) hace que las cosas sean agradables y fáciles al agregar un par de entradas adicionales ('.' Y '..') al nuevo archivo de directorio, simplemente para que sea conveniente moverse por el sistema de archivos. Sospecho que el sistema de archivos funcionaría perfectamente bien sin '.' y '...', pero sería un dolor de usar.
- El archivo de directorio es uno de los pocos tipos de archivos que están marcados como 'especiales'; esto es realmente lo que le dice a cosas como open (2) que se comporten de manera ligeramente diferente. Ver
st_mode
en stat (2).
(copiado de la pregunta original de stackoverflow, 2011-10-20)
..
enlaces duros, su software para caminar por el árbol ya debe tener una excepción de "no seguir ciclos en el enlace del directorio principal" , por lo que se agrega poca complejidad a excepto el.
enlace.