C восстановить stdout на терминал
Я работаю с многопоточной программой.
Сначала я перенаправляю свой stdout в определенный файл. Там нет проблем (я использовал dup2(fd, 1)
, где fd
- файловый дескриптор для файла).
Впоследствии мне нужно снова перенаправить мой stdout на терминал.
Мой первый подход:
/*Declaration*/
fpost_t stream_sdout;
/*code*/
if ( fgetpos( stdout, &stream_sdout) == -1 )
perror(Error:);
В нем говорится о незаконном поиске.
Не знаю, почему это происходит.
Но если я получу это для работы, тогда мне нужно использовать fsetpos(stdout, &stream_stdout)
, и он должен работать.
Моя вторая идея заключалась в том, чтобы скопировать stdout с помощью dup2(stdout, 4)
в таблицу дескриптора файла в позиции 4. Но это тоже не работает.
Как я могу переключить стандартный вывод обратно на исходный пункт назначения (терминал, канал, файл, что угодно)?
Ответы
Ответ 1
#include <unistd.h>
...
int saved_stdout;
...
/* Save current stdout for use later */
saved_stdout = dup(1);
dup2(my_temporary_stdout_fd, 1);
... do some work on your new stdout ...
/* Restore stdout */
dup2(saved_stdout, 1);
close(saved_stdout);
Ответ 2
Прежде чем вы выполните dup2(fd, STDOUT_FILENO)
, вы должны сохранить текущий дескриптор открытого файла для стандартного вывода, выполнив int saved_stdout = dup(STDOUT_FILENO);
(позволяя dup()
выберите доступный номер дескриптора файла для вас). Затем, после того, как вы закончите с выходом, перенаправленным в файл, вы можете сделать dup2(saved_stdout, STDOUT_FILENO)
, чтобы восстановить стандартный вывод до того места, где он был до того, как вы начали все это (и вы должны закрыть saved_stdout
тоже).
Вам нужно беспокоиться о том, чтобы потопить стандартные потоки ввода-вывода (fflush(stdout)
) в подходящее время, когда вы обходитесь с этим. Это означает, что "перед тем, как вы переключаете stdout поверх".
Ответ 3
Если программа работает в среде Linux, вы можете freopen ("/dev/stdout", "a", stdout)
.
Но если вы знаете, что stdout
был терминалом, freopen ("/dev/tty", "a", stdout)
или эквивалентом для других ОС - даже Windows.