Si todo en Unix se ve como archivos (incluidos los directorios) y luego cuando decimos ‘Los archivos se almacenan en directorios’, ¿podemos decir ‘Los archivos se almacenan en Archivos’?

Sí, un directorio en Unix es de hecho un archivo en el que está representado por un i-nodo (Ver inodo) en el sistema de archivos, al igual que cualquier otro archivo. La diferenciación de directorios y archivos ocurre en el hecho de que el campo de mode del i-nodo (que almacena los permisos del archivo, así como el tipo) tiene un indicador de bit particular establecido para un directorio, que no está configurado para un archivo normal .

En notación simbólica, como se muestra en la salida de ls -l , el modo para un directorio se mostrará como drwxrwxrwx lugar de simplemente -rwxrwxrwx .

Por lo tanto, aunque sería técnicamente preciso decir que un directorio es un archivo y, por lo tanto, los archivos se almacenan en archivos, sería un uso muy confuso. Y, el sistema operativo diferencia claramente entre los nodos-i para archivos normales y los nodos-i para otros objetos (como directorios, enlaces simbólicos, sockets, etc.).

El hecho de que todo sea un archivo se refiere solo a la implementación del sistema operativo y a cómo se puede acceder a estos objetos de manera similar utilizando las llamadas al sistema operativo. La diferencia entre estos objetos es clara y bien definida, y por lo tanto valida el uso de diferentes términos en lugar de llamarlos a todos como “archivos”.

El campo de modo del i-nodo

El campo de mode tiene una longitud de 16 bits (pero se almacenará como un valor de 32 bits), de los cuales los 4 bits más significativos se utilizan para determinar el tipo de archivo. Los 9 bits menos significativos determinarán los permisos (los indicadores rwx ).

Puede obtener el valor del campo de mode desde el nodo i mediante la llamada al sistema de stat . Se puede llamar a stat para todos los tipos de archivos, como archivos regulares, directorios, enlaces simbólicos, sockets, etc. Luego, puede probar si un “archivo” es un directorio utilizando la macro S_ISDIR definida en el archivo de encabezado sys/stat.h .

En una implementación de S_ISDIR que encontré aquí (sys / stat.h Source), se define como
#define S_ISDIR(m) ((m & 0170000) == 0040000)

Si convertimos las constantes octales a hexadecimales, sería:
#define S_ISDIR(m) ((m & 0xF000) == 0x4000)

Puede convertir las constantes a binario y ver qué se está comprobando. El “archivo” se identificará como un directorio solo si los 4 MSB de los 16 bits del campo de modo (es decir, los bits 12-15) son 0100 .

Hay otras macros en sys/stat.h para verificar si un archivo es un archivo normal ( S_ISREG ), cola FIFO ( S_ISFIFO ), Enlace simbólico ( S_ISLINK ), Socket ( S_ISSOCK ), etc.

Un directorio es un archivo que contiene información sobre otros archivos y dónde se pueden encontrar en el disco duro. De ahí el término ‘directorio’.