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.