[C con Clase] Sobre el funcionamiento de fprintf al cambiar el descriptor de fichero de stdout en un proceso

Khanabi T34-76 khan_abi_otravez en hotmail.com
Vie Nov 19 14:40:49 CET 2010


Hola, antes que nada quiero decir que es la primera vez que utilizo esta lista de correo (aunque llevo tiempo como lector) así que si no la utilizo de forma correcta, espero que puedan perdonarme =3 

Empezando a trabajar con manejo de ficheros a bajo nivel, hice una práctica sencilla que consistía en cambiarle o usurpar el canal stdout para un proceso, y así hacer que funciones tales como printf escribieran en el nuevo fichero usurpador y no en la salida estándar. Copio el código
//////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char** argv) {
    //Iniciamos todo, duplicamos canal 1
    //(1=stdout)
    int control, desc_copia;   
    control=dup(1);
    printf("DEBUG: Hemos duplicado el fichero en %d\n", control);
    desc_copia=control;
    //fflush(stdin);
    close(1); //Cerramos el canal duplicado
    //Abrimos ahora el fichero que usurpará a stdout
    control=open( "AQUI_EL_PATH/usurpa_stdout.bin", O_WRONLY | O_CREAT,0666);
    //Volcamos a nuestro "stdout"
    printf("Hemos usurpado a stdout!!!\n");
    //Restauramos la situacion
    close(control); //Cerramos el fichero usurpador
    dup(desc_copia); //Deberia quedar en 1 como stdout de nuevo
    printf("DEBUG: Todo ha vuelto a la normalidad?\n");
    return (EXIT_SUCCESS);
}
//////////////////////////////////////////////////////////////////////////////////////////
Me encontré con la curiosa situación de que, si no utilizaba printf antes de cerrar el canal stdout, al imprimir posteriormente encontraba el stdout duplicado y obviaba que mi fichero hubiera usurpado el descriptor de fichero 1. Sacaba el mensaje por terminal igualmente. Así que me picó la curiosidad sobre el funcionamiento interno de fprintf. ¿Pregunta al SO por el descriptor de fichero de la salida estándar la primera vez que es ejecutado? Añadiendo un fflush y obligándolo a manejar el buffer antes de cerrar funciona también con normalidad. Así que debe tratarse de cuestiones del funcionamiento interno de fprintf y sus derivadas, ¿donde puedo encontrar información detallada sobre esta cuestión? ¿Alguien se ha encontrado con este curioso problema?

PD: Lo he compilado y ejecutado en Ubuntu 10.04, ¿será cosa del SO?
 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20101119/30f605e4/attachment.html>


Más información sobre la lista de distribución Cconclase