Descriptores de Archivos
Un descriptor de archivos (file descriptor o fd) es un número entero positivo que se asigna a 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. Entre esta información se especifican las propiedades read-only(solo lectura), write-only(solo escritura), read-write(escritura/lectura), etc.
Tres de los descriptores de archivos más importantes y con los que más se trabaja son:
- Standard Input (fd = 0): Los datos se mandan por la entrada estándar. Por defecto, son los datos que se envían cuando escribimos por teclado.
- Standard Output (fd = 1): Los datos se mandan por la salida estándar. Por defecto, son los datos que se muestran por la pantalla.
- Standard Error (fd = 2): Los datos se mandan por la salida de error. Por defecto, son los datos que se mandan por la pantalla para indicar que un programa ha fallado.
Entrada (stdin) y Salida (stdout) estándar del sistema.
Como usuarios, para poder comunicarnos con nuestro ordenador necesitamos de una serie de herramientas que nos permitan establecer tal comunicación. Además, una vez se ha establecido la comunicación, el usuario tiene que ser capaz de enviar la información al ordenador y tiene que ser capaz de recibir la información que el ordenador le proporciona.
Estas herramientas son comúnmente conocidas como dispositivos de entrada/salida. Así, al dispositivo de entrada se le llama entrada estándar o stdin y al dispositivo de salida se le llama salida estándar o stdout.
Es importante saber que hay un tercer flujo por el cual se envía la información en caso de error. Este flujo de transmisión de datos es conocido como salida de error o error estándar.
Entrada estándar (stdin)
El término stdin hace referencia a un flujo de entrada a donde se envían los datos y de donde un programa recibe la información que necesita para poder ejecutarse.
Se entiende como flujo una transferencia de datos. En el caso de la entrada estándar, será texto lo que se envíe como información a través de este flujo.
Cuando un programa requiere que el usuario le proporcione información, como un nombre, un número, un día, etc., el usuario le proporcionará esta información a través de la entrada estándar utilizando el teclado. No obstante, esta entrada de datos no siempre proviene del teclado. Hay ocasiones en las que se toman los datos de un archivo o el retorno de un programa como información de entrada para que otro programa pueda ejecutarse. Sin embargo, a no ser que se produzca alguna modificación, la entrada estándar siempre estará asociada al descriptor de archivos 0 (fd = 0).
Salida estándar (stdout)
Cuando un programa termina de ejecutarse, en muchas ocasiones debe mostrar en algún sitio el resultado de dicha ejecución. En la mayoría de las ocasiones este sitio se corresponde con la pantalla del ordenador y es la salida estándar (stdout) la que permite que dicho resultado se muestre por pantalla.
Esto es importante ya que para nuestro sistema operativo todo lo relacionado con el ordenador es un fichero. Por tanto, la pantalla va a comunicarse con un fichero que le permita comunicarse con el resto de programas, un fichero representado por STDOUT_FILENO y apuntado por stdout.
No obstante, es importante saber que la pantalla del ordenador no es la salida estándar. Cuando un programa envía el resultado de su ejecución a la salida estándar, la pantalla muestra dicho resultado porque ambas están conectadas. Por defecto, stdout está conectada a la pantalla, pero no significa que sean lo mismo.
Fácilmente puede redireccionarse la salida estándar a un archivo y evitar así que el resultado se muestre por pantalla y ser guardados en un archivo por ejemplo.
La salida estándar siempre estará asociada al descriptor de archivos 0 (fd = 1).
Salida de error o error estándar (stderr)
El stderr también conocido como error estándar, es el descriptor de archivo predeterminado donde un proceso puede escribir mensajes de error.
En la mayoría de las ocasiones, el mensaje de error se muestra por pantalla. Sin embargo, esto no significa que la salida estándar y el error estándar formen parte del mismo flujo de transmisión. En realidad, son dos flujos totalmente distintos que, por defecto, se encuentran conectados con la pantalla del ordenador.
También importante saber que el error estándar está asociado al descriptor de archivos 2 o fd = 2. A no ser que se especifique lo contrario, este descriptor de archivos siempre va a mostrar su contenido por pantalla. No obstante, al igual que sucede con stdout, podemos redireccionar a stderr para que en lugar de mostrar el contenido por pantalla, lo envíe a un archivo o a otro programa.
Redireccionamiento de descriptores de archivos
En Linux, los redireccionamientos de descriptores de archivos son una funcionalidad poderosa que permite manipular el flujo de entrada y salida estándar de los comandos. Estos redireccionamientos permiten redirigir la entrada y salida de un comando desde y hacia archivos, dispositivos o incluso otros comandos. En este artículo, exploraremos los diferentes tipos de redireccionamientos de descriptores de archivos y cómo utilizarlos en Linux.
Redireccionamiento de salida estándar (>)
El redireccionamiento de salida estándar, representado por el símbolo «>», permite redirigir la salida de un comando hacia un archivo en lugar de mostrarla en la pantalla. El archivo puede ser uno existente o uno nuevo que se creará. Por ejemplo: