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).
Nombre | Descriptor de archivo | Descripción | Abreviatura |
---|---|---|---|
Entrada estándar | 0 | La 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ándar | 1 | La 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ándar | 2 | La 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