Un descriptor de archivo es un número que identifica de forma única un archivo abierto en el sistema operativo de un equipo. Describe un recurso de datos y cómo se puede acceder a ese recurso.
Cuando un programa pide abrir un archivo u otro recurso de datos, como un socket de red, el núcleo:
- Concede acceso.
- Crea una entrada en la tabla de archivos global.
- Proporciona al software la ubicación de esa entrada.
El descriptor se identifica por un entero único no negativo, como 0, 12 o 567. Existe al menos un descriptor de archivo por cada archivo abierto en el sistema.los descriptores de archivo
se utilizaron por primera vez en Unix, y son utilizados por los sistemas operativos modernos, incluidos Linux, macOS y BSD. En Microsoft Windows, los descriptores de archivo se conocen como manejadores de archivos.
Descripción general
Cuando un proceso realiza una solicitud exitosa para abrir un archivo, el núcleo devuelve un descriptor de archivo que apunta a una entrada en la tabla de archivos global del núcleo. La entrada de la tabla de archivos contiene información como el inodo del archivo, el desplazamiento 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 tipo Unix, los tres primeros descriptores de archivo, por defecto, son STDIN (entrada estándar), STDOUT (salida estándar) y STDERR (error estándar).
Nombre | del descriptor de Archivo | Descripción | Abreviatura |
---|---|---|---|
entrada Estándar | 0 | El valor predeterminado de la secuencia de datos de entrada, por ejemplo en una canalización de comandos. En el terminal, el valor predeterminado es la entrada de teclado del usuario. | stdin |
Salida estándar | 1 | El flujo de datos predeterminado para la salida, por ejemplo, cuando un comando imprime texto. En el terminal, el valor predeterminado es la pantalla del usuario. | salida estándar |
Error estándar | 2 | El flujo de datos predeterminado para la salida que se relaciona con un error que se produce. En el terminal, el valor predeterminado es la pantalla del usuario. | stderr |
Descriptores de archivo de redirección
Se puede acceder directamente a los descriptores de archivo mediante bash, el shell predeterminado de Linux, macOS X y el subsistema Windows para Linux.
Por ejemplo, cuando se utiliza el comando find, la salida correcta va a stdout (descriptor de archivo 1), y los mensajes de error van a stderr (descriptor de archivo 2). Ambas secuencias se muestran como salida de terminal:
find / -name '*something*'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
Estamos recibiendo errores porque find está tratando de 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 redirigiendo el descriptor de archivo 2 a/dev/null, el dispositivo especial en Linux que «no va a ninguna parte»:
find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
Los errores enviados a/dev / null, y no se muestran.
Comprender la diferencia entre stdout y stderr es importante cuando se desea trabajar con la salida de un programa. Por ejemplo, si intenta grep la salida del comando find, notará que los mensajes de error no se filtran, porque solo la salida estándar se canaliza a grep.
find / -name '*something*' | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
Sin embargo, puede redirigir el error estándar a la salida estándar, y luego grep procesará el texto de ambos:
find / -name '*something*' 2>&1 | grep 'something'
/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 de archivo de destino (1) tiene el prefijo ampersand («&»). Para obtener más información sobre la redirección de flujos de datos, consulte canalizaciones en el shell de bash.
Para ver ejemplos de creación y uso de descriptores de archivos en bash, consulte nuestros ejemplos de comandos incorporados a exec.
Manejador de archivos, Términos del sistema operativo