Además de las respuestas de @ RuiFRibeiro y @ BruceEdiger, la distinción que usted hace no es exactamente la distinción que hace el núcleo. En realidad, tiene varios tipos de archivos: archivos normales, directorios, enlaces simbólicos, dispositivos, sockets (y siempre olvido algunos, así que no intentaré hacer una lista completa). Puede tener la información sobre el tipo de archivo con ls
: es el primer carácter de la línea. Por ejemplo:
$ls -la /dev/sda
brw-rw---- 1 root disk 8, 0 17 nov. 08:29 /dev/sda
La 'b' al principio indica que este archivo es un dispositivo de bloque. Un guión significa un archivo normal, 'l', un enlace simbólico, etc. Esta información se almacena en los metadatos del archivo y es accesible a través de la llamada del sistemastat
por ejemplo, se puede , por lo que el núcleo puede leer de manera diferente un archivo y un enlace simbólico, por ejemplo.
Luego, hace otra distinción entre "archivos reales" /bin/bash
y "archivos virtuales", /proc/cpuinfo
pero ls
informa ambos como archivos normales, por lo que la diferencia es de otro tipo:
ls -la /proc/cpuinfo /bin/bash
-rwxr-xr-x 1 root root 829792 24 août 10:58 /bin/bash
-r--r--r-- 1 root wheel 0 20 nov. 16:50 /proc/cpuinfo
Lo que sucede es que pertenecen a diferentes sistemas de archivos. /proc
es el punto de montaje de un pseudo-sistema de archivos procfs
mientras /bin/bash
está en un sistema de archivos de disco normal. Cuando Linux abre un archivo (lo hace de manera diferente según el sistema de archivos), llena una estructura de datos file
que tiene, entre otros atributos, una estructura de varios punteros de función que describen cómo usar este archivo. Por lo tanto, puede implementar comportamientos distintos para diferentes tipos de archivos.
Por ejemplo, estas son las operaciones anunciadas por /proc/meminfo
:
static int meminfo_proc_open(struct inode *inode, struct file *file)
{
return single_open(file, meminfo_proc_show, NULL);
}
static const struct file_operations meminfo_proc_fops = {
.open = meminfo_proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
Si observa la definición de meminfo_proc_open
, puede ver que esta función llena un búfer en la memoria con la información devuelta por la función meminfo_proc_show
, cuya tarea es recopilar datos sobre el uso de la memoria. Esta información se puede leer normalmente. Cada vez que abre el archivo, meminfo_proc_open
se llama a la función y se actualiza la información sobre la memoria.