Как восстановить stdout после использования freopen

Я пытаюсь перенаправить вывод в моей программе на С++ из stdout со следующим:

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

Затем я вызываю систему для выполнения cmd. Я также попробовал форкировать, а затем вызвал execvp. В любом случае, когда управление программой возвращается к моей программе, вещи, записанные в stdout, больше не отображаются. Как восстановить нормальное поведение?

Ответ 1

Сделайте это:

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

Если вы можете использовать STDOUT_FILENO из <unistd.h> вместо 1 в качестве первого аргумента fdopen.

Ответ 2

Вот решение для stdin, если вы делаете это в цикле, чтобы понять это для программы, в которой freopen stdin происходит в цикле в каком-то состоянии. Потребовалось некоторое время для меня, чтобы выяснить (с помощью поиска и всех) и поэтому размещать здесь

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;  
        }  
        .  
        .  

}