DEV Community

Cover image for En Unix/Linux todo es un archivo
DjSurgeon
DjSurgeon

Posted on

En Unix/Linux todo es un archivo

Todo es un Archivo en Unix/Linux

El sistema operativo Unix y sus derivados, como Linux, se basan en un principio fundamental: todo es un archivo. Esta filosofía de diseño simplifica la interacción con el sistema, permitiendo que programas, documentos, directorios, procesos y dispositivos sean tratados de manera uniforme mediante un conjunto de utilidades.

¿Qué significa "todo es un archivo"?

En Unix/Linux, casi cualquier recurso del sistema es accesible como si fuera un archivo. Esto incluye no solo los típicos archivos tradicionales como documentos de texto, imágenes o ejecutables, sino también directorios, procesos de ejecución o incluso conexiones de red.

Cada uno de estos elementos se representa mediante un descriptor de archivo, un número entero único que el kernel asigna a cada archivo abierto por un proceso. La ruta se convierte en el sistema de direccionamiento, y el descriptor en la interfaz del flujo de bytes I/O. En este sentido, podríamos afirmar que en Unix/Linux todo es un descriptor de archivo, o al menos, casi todo puede ser representado de esta manera.

¿Qué es un Descriptor de Archivos?

Un descriptor de archivos (file descriptor o fd) es un número entero positivo que utiliza un proceso para identificar un archivo abierto dentro del sistema.

Cuando un programa quiere acceder a un archivo abierto, el kernel le devuelve un descriptor de archivos. Este fd apunta a una entrada específica dentro de la tabla de archivos del kernel. Esta tabla contiene información sobre el archivo al que hace referencia el descriptor de archivos, como sus permisos de acceso (solo lectura, solo escritura, lectura y escritura, etc.).

Descriptores de archivo estándar en POSIX

En sistemas POSIX, existen tres descriptores de archivo estándar:

Valor entero Nombre Descripción
0 Entrada estándar (stdin) Donde un programa recibe la entrada de datos, generalmente el teclado.
1 Salida estándar (stdout) Donde un programa envía su salida, generalmente la pantalla.
2 Error estándar (stderr) Donde un programa envía sus mensajes de error, generalmente la pantalla.

Estos tres flujos permiten que los programas puedan recibir entrada, mostrar información y reportar errores de manera flexible.

Entrada (stdin) y Salida (stdout) estándar del sistema

Para que un usuario se comunique con el sistema, se utilizan dispositivos de entrada/salida.

  • Entrada estándar (stdin): El flujo de datos donde un programa recibe información. Por defecto, proviene del teclado, pero también puede ser redirigido desde un archivo o el resultado de otro programa.
  • Salida estándar (stdout): El flujo donde un programa escribe su salida. Por defecto, está conectada a la pantalla del usuario, pero puede redirigirse a un archivo o a otro programa.
  • Salida de error estándar (stderr): Similar a stdout, pero diseñado específicamente para mensajes de error. Permite diferenciar la salida normal de la salida de error.

Redirección y manipulación de descriptores de archivos

Dado que Unix/Linux trata todo como un archivo, los descriptores de archivo pueden ser redirigidos. Esto permite enviar datos a un archivo en lugar de la pantalla o encadenar comandos.

Ejemplo de redirección de salida estándar:

ls > lista_archivos.txt
Enter fullscreen mode Exit fullscreen mode

Esto guarda el resultado del comando ls en el archivo lista_archivos.txt en lugar de mostrarlo en pantalla.

Ejemplo de redirección de error estándar:

comando_inexistente 2> error.log
Enter fullscreen mode Exit fullscreen mode

Esto almacena los mensajes de error en el archivo error.log.

Objetos como descriptores de archivo

Bajo Unix/Linux, incluso un directorio puede ser abierto como un archivo regular, conteniendo registros de tamaño fijo con información sobre los archivos y subdirectorios dentro de él. Sin embargo, los directorios no pueden escribirse directamente; cualquier modificación se realiza a través del sistema de archivos del kernel.

Algunas interfaces en Unix/Linux cumplen parcialmente con esta filosofía. Por ejemplo:

  • Tuberías sin nombre (pipes): pipe() crea un par de descriptores de archivo usados para comunicación entre procesos sin aparecer en el sistema de archivos.
  • Tuberías con nombre (FIFOs): Son similares a las pipes, pero aparecen en el sistema de archivos y pueden ser referenciadas como archivos normales.
  • Sockets: También utilizan descriptores de archivo, pero requieren configuraciones específicas (bind(), connect(), etc.) antes de ser usados para I/O. Esto permite tratar las conexiones de red con la misma lógica que cualquier otro archivo en Unix/Linux.

El sistema de archivos como API

Algunas interfaces en Unix/Linux están implementadas como sistemas de archivos en lugar de llamadas al sistema. Un claro ejemplo es /proc, un sistema de archivos virtual donde cada proceso en ejecución tiene un directorio con información sobre su estado, recursos abiertos y entorno de ejecución.

Por ejemplo, para ver los archivos abiertos por un proceso, basta con listar /proc/<PID>/fd/. Esto evita la necesidad de llamadas especializadas y permite usar herramientas estándar como ls, cat o grep.

Top comments (0)