¿Qué significa que en Linux todo es archivo?



Ángel Vilte, de la Facultad de la Universidad de la Plata me invitó a dar una charla para un evento de software libre. Las diapositivas de la misma se pueden descargar haciendo clic en filesystems .\

Todo es archivos

Eso no es del todo correcto. Es más apropiado decir que todo es un descriptor de archivo o que todo puede tener un descriptor de archivo. En Linux un descriptor de archivo es un identificador único de proceso para un archivo u otro recurso de entrada o salida. Por ejemplo, no existe necesariamente un archivo para una interfaz de red. Sin embargo existen sockets relacionados con ellas.

En el siguiente ejemplo podemos ver los descriptores de archivos para la ip 127.0.0.1 de la interfaz lo.

sudo lsof -n -i@127.0.0.1
COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd   1337 chrony    5u  IPv4   8171      0t0  UDP 127.0.0.1:323 
cupsd     1538   root    7u  IPv4  14727      0t0  TCP 127.0.0.1:ipp (LISTEN)
qemu-syst 1774   qemu   32u  IPv4  19480      0t0  TCP 127.0.0.1:rfb (LISTEN)
syncthing 2620 sergio   19u  IPv4  22825      0t0  TCP 127.0.0.1:8384 (LISTEN)

En este caso, vemos los descriptores de archivos de lectura y escritura 5u, 7u, 32u y 19u.

lsfd -p 646429 -i   -o +FD
COMMAND    PID   USER ASSOC  XMODE   TYPE SOURCE MNTID   INODE NAME                           FD
ping    646429 sergio     3 rw---m   PING sockfs     9 3737509 state=close id=3 laddr=0.0.0.0  3
ping    646429 sergio     4 rw---- PINGv6 sockfs     9 3737510 socket:[3737510]                4
 ls -l /proc/646429/fd
total 0
lrwx------ 1 sergio sergio 64 may 11 03:21 0 -> /dev/pts/6lsfd -p 646429  -Q '(FD == 1) or (FD == 2)'
COMMAND    PID   USER ASSOC  XMODE TYPE SOURCE MNTID    INODE NAME
ping    646429 sergio     1 -w-D--  REG   0:41    94 37863261 /home/sergio/to_delete/ping.log 
ping    646429 sergio     2 -w-D--  REG   0:41    94 37863261 /home/sergio/to_delete/ping.log 
l-wx------ 1 sergio sergio 64 may 11 03:21 1 -> /home/sergio/to_delete/ping.log
l-wx------ 1 sergio sergio 64 may 11 03:21 2 -> /home/sergio/to_delete/ping.log
lrwx------ 1 sergio sergio 64 may 11 03:21 3 -> 'socket:[3737509]'
lrwx------ 1 sergio sergio 64 may 11 03:21 4 -> 'socket:[3737510]'
lsfd -p 646429  -Q '(FD == 1) or (FD == 2)'
COMMAND    PID   USER ASSOC  XMODE TYPE SOURCE MNTID    INODE NAME
ping    646429 sergio     1 -w-D--  REG   0:41    94 37863261 /home/sergio/to_delete/ping.log 
ping    646429 sergio     2 -w-D--  REG   0:41    94 37863261 /home/sergio/to_delete/ping.log 

Despué de borrar ping.log:

lsfd -p 646429  -Q '(FD == 1) or (FD == 2)'
COMMAND    PID   USER ASSOC  XMODE TYPE SOURCE MNTID    INODE NAME
ping    646429 sergio     1 -w----  REG   0:41    94 37863261 /home/sergio/to_delete/ping.log
ping    646429 sergio     2 -w----  REG   0:41    94 37863261 /home/sergio/to_delete/ping.log

Descriptor de archivo para abrirlo, leerlo y modificarlo como si fuera un archivo.

Cada vez que un proceso abre un archivo (o cualquier otro recurso que pueda ser representado como un archivo en el sistema operativo), el kernel del sistema operativo asigna un descriptor de archivo único para ese archivo abierto. Este descriptor de archivo actúa como un "enlace" entre el proceso y el archivo, permitiendo al proceso interactuar con el archivo mediante operaciones de lectura, escritura, búsqueda, etc.

Por lo tanto, puedes pensar en el descriptor de archivo como un puente entre el proceso y el recurso que está accediendo. Permite al proceso comunicarse con el recurso subyacente de manera eficiente y uniforme, independientemente de si el recurso es un archivo en el sistema de archivos, un dispositivo de hardware o un socket de red.

Comentarios


Comments powered by Disqus