<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
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 <br><br>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<br>//////////////////////////////////////////////////////////////////////////////////////<br>#include <stdio.h><br>#include <stdlib.h><br>#include <unistd.h><br>#include <fcntl.h><br><br>int main(int argc, char** argv) {<br>    //Iniciamos todo, duplicamos canal 1<br>    //(1=stdout)<br>    int control, desc_copia;   <br>    control=dup(1);<br>    printf("DEBUG: Hemos duplicado el fichero en %d\n", control);<br>    desc_copia=control;<br>    //fflush(stdin);<br>    close(1); //Cerramos el canal duplicado<br>    //Abrimos ahora el fichero que usurpará a stdout<br>    control=open( "AQUI_EL_PATH/usurpa_stdout.bin", O_WRONLY | O_CREAT,0666);<br>    //Volcamos a nuestro "stdout"<br>    printf("Hemos usurpado a stdout!!!\n");<br>    //Restauramos la situacion<br>    close(control); //Cerramos el fichero usurpador<br>    dup(desc_copia); //Deberia quedar en 1 como stdout de nuevo<br>    printf("DEBUG: Todo ha vuelto a la normalidad?\n");<br>    return (EXIT_SUCCESS);<br>}<br>//////////////////////////////////////////////////////////////////////////////////////////<br>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?<br><br>PD: Lo he compilado y ejecutado en Ubuntu 10.04, ¿será cosa del SO?<br>                                        </body>
</html>