C将stdout恢复到终端

时间:2012-06-14 22:27:39

标签: 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),它应该可以工作。

我的第二个想法是,使用dup2(stdout, 4)将stdout复制到位置4的文件描述符表。但是这也不起作用。

如何将标准输出切换回原始目的地(终端,管道,文件等)?

3 个答案:

答案 0 :(得分:28)

#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);

答案 1 :(得分:8)

在执行dup2(fd, STDOUT_FILENO)之前,您应该通过执行int saved_stdout = dup(STDOUT_FILENO);(让dup()为您选择可用的文件描述符编号)来保存标准输出的当前打开文件描述符。然后,在您完成重定向到文件的输出后,您可以执行dup2(saved_stdout, STDOUT_FILENO)将标准输出恢复到开始所有这些之前的位置(并且您也应该关闭saved_stdout)。 / p>

您需要担心在适当的时候刷新标准I / O流(fflush(stdout))。这意味着'在你将stdout切换为'之前。

答案 2 :(得分:0)

如果程序在Linux环境中运行,您可以freopen ("/dev/stdout", "a", stdout)

但是如果你知道stdout是终端,freopen ("/dev/tty", "a", stdout)或其他操作系统的等价物 - 甚至是Windows。