2011-07-24 12 views
6

Estoy tratando de usar redirecciones en C para redirigir la entrada a un archivo y luego configurar la salida estándar para imprimir en la pantalla. ¿Podría alguien decirme qué pasa con este código?redireccionando la salida estándar en c y restableciendo la salida estándar

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main(int argc, char** argv) { 
    //create file "test" if it doesn't exist and open for writing setting permissions to 777 
    int file = open("test", O_CREAT | O_WRONLY, 0777); 
    //create another file handle for output 
    int current_out = dup(1); 

    printf("this will be printed to the screen\n"); 

    if(dup2(file, 1) < 0) { 
     fprintf(stderr, "couldn't redirect output\n"); 
     return 1; 
    } 

    printf("this will be printed to the file\n"); 

    if(dup2(current_out, file) < 0) { 
     fprintf(stderr, "couldn't reset output\n"); 
     return 1; 
    } 

    printf("and this will be printed to the screen again\n"); 

    return 0; 
} 
+1

Existe una forma completamente diferente de resolver este mismo problema aquí: http://stackoverflow.com/questions/584868/rerouting-stdin-and-stdout-from-c. – Sam

Respuesta

3

Su segundo dup2 llamada es incorrecto, sustituir con:

if (dup2(current_out, 1) < 0) { 
4

Una cosa que usted tiene que asegurarse de que hacer antes de que funcionará en absoluto, es llamar fflush(stdout); antes de cambiar el descriptor de archivo stdout de debajo de ella. Lo que probablemente está sucediendo es que la biblioteca estándar de C está almacenando en búfer su salida, sin darse cuenta de que está cambiando los descriptores de archivo debajo de ella. Los datos que escriba utilizando printf() no es en realidad enviados al descriptor de archivo subyacente hasta que su búfer se llene (o su programa regrese de main).

Inserte la llamada de esta manera:

fflush(stdout); 
    if(dup2(file, 1) < 0) { 

antes de que ambas llamadas a dup2().

+0

No creo que este fuera el problema de OP aquí, pero es un buen consejo y casi siempre se debe seguir siempre que mezcle stdio con el descriptor de archivo io. –

+1

Es cierto, en realidad no noté el descriptor de archivo incorrecto al principio hasta que alguien más lo mencionó. Al escribir en un terminal, la salida de stdio probablemente será un buffer de línea, por lo que es probable que el código sin 'fflush()' funcione hasta que el OP intente redirigir el stdout a un archivo. –

1

basta con sustituir dup2(current_out, file) con dup2(current_out, 1), y las cosas deben funcionar mejor.

Cuestiones relacionadas