neuromancer
neuromancer

Reputation: 55539

How to restore stdout after using freopen

I try to redirect output in my c++ program from stdout with the following:

 freopen(cmd.c_str(),"w",stdout);    

Then I call system to execute cmd. I have also tried forking and then calling execvp. Either way, when program control returns to my program, things written to stdout are no longer showing. How can normal behavior be restored?

Upvotes: 14

Views: 8607

Answers (2)

shyam
shyam

Reputation: 31

Here is solution for stdin if doing in loop, needed to figure this out for a program wherein freopen of stdin happens in a loop on some condition. Took some time for me to figure out (with help of search and all) and so posting here

savestdin = dup(STDIN_FILENO);  
while (1) {  
        .  
        .  
        if (inputfile) {  
              savestdin = dup(savestdin);
              freopen(inputfile, "r", stdin);  
              restorestdin = TRUE;
         }  
        .  
        .  
        if (restorestdin) {  
              fflush(stdin);  
              fclose(stdin);
              stdin = fdopen(savestdin, "r");  
              restorestdin = FALSE;  
        }  
        .  
        .  

} 

Upvotes: 3

Sarfaraz Nawaz
Sarfaraz Nawaz

Reputation: 361612

Do this:

fclose(stdout);
stdout = fdopen(1, "w"); //reopen: 1 is file descriptor of std output

If you can use STDOUT_FILENO from <unistd.h>, instead of 1 as first argument to fdopen.

Upvotes: 1

Related Questions