En realidad es bastante simple, al menos si no necesita los detalles de implementación.
En primer lugar, en Linux todos los sistemas de archivos (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) se implementan en el núcleo. Algunos pueden descargar el trabajo al código del país de usuario a través de FUSE, y algunos vienen solo en forma de un módulo del núcleo ( ZFS nativo es un ejemplo notable de este último debido a restricciones de licencia), pero de cualquier manera sigue siendo un componente del núcleo. Este es un básico importante.
Cuando un programa quiere leer desde un archivo, que emitirá diversas llamadas a las bibliotecas del sistema que finalmente terminan en el núcleo en forma de open()
, read()
, close()
secuencia (posiblemente con seek()
tirado en una buena medida). El núcleo toma la ruta y el nombre de archivo proporcionados, y a través del sistema de archivos y la capa de E / S del dispositivo los traduce a solicitudes de lectura física (y en muchos casos también solicitudes de escritura, piense, por ejemplo, en actualizaciones de tiempo) a algún almacenamiento subyacente.
Sin embargo, no tiene que traducir esas solicitudes específicamente al almacenamiento físico y persistente . El contrato del núcleo es que la emisión de ese conjunto particular de llamadas al sistema proporcionará el contenido del archivo en cuestión . Donde exactamente en nuestro ámbito físico existe el "archivo" es secundario a esto.
Por /proc
lo general, se monta lo que se conoce como procfs
. Ese es un tipo de sistema de archivos especial, pero como es un sistema de archivos, realmente no es diferente de, por ejemplo, un ext3
sistema de archivos montado en algún lugar. Entonces, la solicitud se pasa al código del controlador del sistema de archivos procfs, que conoce todos estos archivos y directorios y devuelve información particular de las estructuras de datos del núcleo .
La "capa de almacenamiento" en este caso son las estructuras de datos del núcleo y procfs
proporciona una interfaz limpia y conveniente para acceder a ellas. Tenga en cuenta que montar procesos en /proc
es simplemente una convención; podrías montarlo fácilmente en otro lugar. De hecho, eso a veces se hace, por ejemplo en chroot jails cuando el proceso que se ejecuta allí necesita acceso a / proc por alguna razón.
Funciona de la misma manera si escribe un valor en algún archivo; a nivel del kernel, que se traduce en una serie de open()
, seek()
, write()
, close()
las llamadas que a su vez van pasando al controlador del sistema de archivos; de nuevo, en este caso particular, el código procfs.
La razón particular por la que ve file
regresar empty
es que muchos de los archivos expuestos por procfs están expuestos con un tamaño de 0 bytes. El tamaño de 0 bytes probablemente sea una optimización en el lado del kernel (muchos de los archivos en / proc son dinámicos y pueden variar fácilmente en longitud, posiblemente incluso de una lectura a la siguiente, y calcular la longitud de cada archivo en cada lectura de directorio sería potencialmente ser muy caro). Al seguir los comentarios a esta respuesta, que puede verificar en su propio sistema ejecutando strace o una herramienta similar, file
primero realiza una stat()
llamada para detectar cualquier archivo especial y luego aprovecha la oportunidad para, si el tamaño del archivo se informa como 0 , aborta e informa que el archivo está vacío.
Este comportamiento está realmente documentado y puede anularse especificando -s
o --special-files
en la file
invocación, aunque como se indica en la página del manual que puede tener efectos secundarios. La cita a continuación es de la página del manual del archivo BSD 5.11, fechada el 17 de octubre de 2011.
Normalmente, el archivo solo intenta leer y determinar el tipo de archivos de argumentos cuyos informes stat (2) son archivos normales. Esto evita problemas, porque leer archivos especiales puede tener consecuencias peculiares. Al especificar la -s
opción, el archivo también lee archivos de argumentos que son archivos especiales de bloques o caracteres. Esto es útil para determinar los tipos de datos del sistema de archivos en particiones de disco sin formato, que son archivos especiales de bloques. Esta opción también hace que el archivo ignore el tamaño del archivo según lo informado por stat (2) ya que en algunos sistemas informa un tamaño cero para particiones de disco sin formato.
strace file /proc/version
oltrace -S /proc/version
, la optimización es bastante pequeña. Primero realiza unastat()
llamada y descubre que el tamaño es 0, omitiendo asíopen()
, pero antes de eso está cargando varios archivos mágicos.