Ответ 1
Сделайте это:
fclose(stdout);
stdout = fdopen(1, "w"); //reopen: 1 is file descriptor of std output
Если вы можете использовать STDOUT_FILENO из <unistd.h>
вместо 1
в качестве первого аргумента fdopen
.
Я пытаюсь перенаправить вывод в моей программе на С++ из stdout со следующим:
freopen(cmd.c_str(),"w",stdout);
Затем я вызываю систему для выполнения cmd. Я также попробовал форкировать, а затем вызвал execvp. В любом случае, когда управление программой возвращается к моей программе, вещи, записанные в stdout, больше не отображаются. Как восстановить нормальное поведение?
Сделайте это:
fclose(stdout);
stdout = fdopen(1, "w"); //reopen: 1 is file descriptor of std output
Если вы можете использовать STDOUT_FILENO из <unistd.h>
вместо 1
в качестве первого аргумента fdopen
.
Вот решение для 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;
}
.
.
}