¿Cómo se lee un directorio como un archivo en Unix?
Pregunta
Yo entiendo que un directorio es simplemente un archivo en UNIX que contiene los números de inodo y los nombres de los archivos dentro. ¿Cómo tomo un vistazo a esto? No puedo usar gato o menos en un directorio, y abriéndola en vi solo me muestra una lista de los archivos ... no hay números de inodo.
Solución
Como se trata de una cuestión de programación (que es una cuestión de programación, ¿verdad?), Que debe salir de las funciones opendir
, readdir
y closedir
. Estos son parte de la Single UNIX Espec.
#include <sys/types.h>
#include <dirent.h>
DIR *opendir (const char *dirname);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
El archivo dirent.h
debe tener la estructura que necesita, que contiene al menos:
char d_name[] name of entry
ino_t d_ino file serial number
aquí para la página de manual readdir
- contiene enlaces a los otros.
Tenga en cuenta que la cantidad de información acerca de un archivo almacenado en las entradas de directorio para ello es mínimo. El i-nodo en sí contiene el material que se obtiene de la función stat
, cosas como tiempos, tamaño, propietario, permisos, etc., junto con los punteros de suma importancia en el contenido real del archivo.
Otros consejos
En los viejos tiempos - Versión 7, Sistema III, a principios Sistema V - que de hecho podría abrir un directorio y leer el contenido en la memoria, especialmente para el sistema de archivos Unix de edad con números de inodo de 2 bytes y un límite de 14 bytes en el nombre del archivo.
A medida que los sistemas de archivos más exóticos se hicieron más frecuentes, el opendir (), readdir (), closedir () de la familia de llamadas a funciones tuvo que ser utilizado en su lugar porque al analizar el contenido de un directorio hizo cada vez más no trivial.
Finalmente, en la última década más o menos, se ha llegado al punto en el que en la mayoría de los sistemas, no se puede leer el directorio; se puede abrir (principalmente por lo que las operaciones tales como fchdir () pueden trabajar), y se puede utilizar la familia opendir () de llamadas para leerlo.
Parece que el comando stat
podría estar en orden. Desde el artículo:
stat /etc/passwd
File: `/etc/passwd'
Size: 2911 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 324438 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2008-08-11 05:24:17.000000000 -0400
Modify: 2008-08-03 05:11:05.000000000 -0400
Change: 2008-08-03 05:11:05.000000000 -0400