dup y dup2

Las llamadas al sistema dup proporcionan un modo para duplicar un descriptor de archivos, presentando dos o más descriptores diferentes que acceden al mismo archivo. Se pueden usar para leer y escribir en diferentes partes del archivo. La llamada al sistema dup duplica un descriptor de archivo, fildes, enviando un nuevo descriptor. La llamada al sistema dup2 copia eficazmente un descriptor de archivo a otro especificando qué descriptor usar para la copia.

La llamada dup2 permite generar un duplicado de un descriptor existente, tiene el siguiente prototipo:

dup_dup2_sintaxisEsta función devuelve -1 en caso de error. En caso de éxito, el descriptor fIldes2 pasa a ser un duplicado del descriptor fildes.

¿Como funciona?

Supongamos la siguiente tabla de descriptores de archivos:

tabla_descriptoresFíjese que ya existe un descriptor fildes para manejar el fichero datos.txt, que se obtuvo mediante la llamada open, por tanto, el valor del descriptor es seleccionado por el sistema operativo (en nuestro caso, hemos seleccionado el valor 32 arbitrariamente).

A partir de dicha situación, tras realizar la siguiente llamada:

dup2(fd, STDOUT_FILENO);

El resultado sobre la tabla de descriptores es la siguiente:

tabla_descriptores2Por tanto, tras la llamada dup2 se genera el duplicado, de manera que el descriptor 1 (STDOUT_FILENO) ya no apunta a la pantalla sino al fichero datos.txt:

De esta manera, cuando invoquemos a printf el mensaje que se pase como parámetro no se imprimirá en pantalla, sino que se almacenará en el fichero datos.txt.

Programa de ejemplo

Este programa imprime “Hola Mundo” en  un archivo llamado salida.txt mediante dup2:

programa_holamundoDespués de compilado el resultado sería:

ejemplo_salida_holamundoatras

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s