¿Qué es un descriptor de archivo?

Un descriptor de archivo es un número que identifica de manera única un archivo abierto en el sistema operativo de una computadora. Describe un recurso de datos y cómo se puede acceder a ese recurso.

Cuando un programa solicita abrir un archivo, u otro recurso de datos, como un socket de red, el núcleo del sistema operativo otorga acceso, ingresa una entrada en la tabla de archivos global y proporciona al software la ubicación de esa entrada.

El descriptor se identifica mediante un entero no negativo único, como 0, 12 o 567 . Existe al menos un descriptor de archivo para cada archivo abierto en el sistema.

Los descriptores de archivos se utilizaron por primera vez en Unix y se utilizan en los sistemas operativos modernos, incluidos Linux, macOS X y BSD. En Microsoft Windows, los descriptores de archivos se conocen como manejadores de archivos.

  • Visión general
  • Stdin, stdout y stderr
  • Redireccionando descriptores de archivos

Cuando un proceso realiza una solicitud exitosa para abrir un archivo, el kernel devuelve un descriptor de archivo que apunta a una entrada en la tabla de archivos global del kernel. La entrada de la tabla de archivos contiene información como el inodo del archivo, la compensación de bytes y las restricciones de acceso para ese flujo de datos (solo lectura, solo escritura, etc.).

Stdin, stdout y stderr

En un sistema operativo similar a Unix, los primeros tres descriptores de archivo, de manera predeterminada, son STDIN (entrada estándar), STDOUT (salida estándar) y STDERR (error estándar).

NombreDescriptor de archivoDescripciónAbreviatura
Entrada estándar0La secuencia de datos predeterminada para la entrada, por ejemplo, en una canalización de comandos. En el terminal, esto se establece de forma predeterminada en la entrada de teclado del usuario.stdin
Salida estándar1La secuencia de datos predeterminada para la salida, por ejemplo, cuando un comando imprime texto. En el terminal, esto se establece por defecto en la pantalla del usuario.stdout
Error estándar2La secuencia de datos predeterminada para la salida que se relaciona con un error que está ocurriendo. En el terminal, esto se establece por defecto en la pantalla del usuario.Stderr

Redireccionando descriptores de archivos

Se puede acceder directamente a los descriptores de archivos utilizando bash, el shell predeterminado de Linux, macOS X y Windows Subsystem for Linux.

Por ejemplo, cuando usa el comando de búsqueda, la salida exitosa va a stdout (descriptor de archivo 1 ), y los mensajes de error van a stderr (descriptor de archivo 2 ). Ambos flujos se muestran como salida de terminal:

 encontrar / -nombre '* algo *' 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random find: `/ run / udisks2 ': Permiso denegado encuentre:` / run / wpa_supplicant': Permiso denegado / usr / share / something / usr / juegos / algo 

Estamos recibiendo errores porque buscar está intentando buscar en algunos directorios del sistema que no tenemos permiso para leer. Todas las líneas que dicen "Permiso denegado" se escribieron en stderr, y las otras líneas se escribieron en stdout .

Puede ocultar stderr redireccionando el descriptor de archivo 2 a / dev / null, el dispositivo especial en Linux que "no va a ninguna parte":

 encuentra / -name '* algo *' 2> / dev / null 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / something 

Los errores se han enviado a / dev / null y no se muestran.

Comprender la diferencia entre stdout y stderr es importante cuando desea trabajar con la salida de un programa. Por ejemplo, si intenta grep la salida del comando de búsqueda, notará que los mensajes de error no se filtran, porque solo la salida estándar se canaliza a grep .

 encontrar / -nombre '* algo *' | grep 'algo' 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random find: `/ run / udisks2 ': Permiso denegado encuentre:` / run / wpa_supplicant': Permiso denegado / usr / share / something / usr / juegos / algo 

Sin embargo, puede redirigir el error estándar a la salida estándar, y luego grep procesará el texto de ambos:

 encontrar / -nombre '* algo *' 2> & 1 | grep 'algo' 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / something 

Observe que en el comando anterior, el descriptor del archivo de destino ( 1 ) tiene un prefijo con un signo (" & "). Para obtener más información sobre la redirección del flujo de datos, vea las tuberías en el shell bash.

Para ver ejemplos de creación y uso de descriptores de archivos en bash, consulte nuestros ejemplos de comandos exec builtin.

Manejador de archivos, términos del sistema operativo