26

我正在使用多线程程序。

首先,我将我的标准输出重定向到某个文件。那里没问题(我使用了文件的文件描述符在dup2(fd, 1)哪里)。fd

之后,我需要再次将我的标准输出重定向到终端。

我的第一种方法:

      /*Declaration*/
      fpost_t  stream_sdout;
      /*code*/
      if ( fgetpos( stdout, &stream_sdout) == -1 )
          perror(Error:);

它说非法搜索。
不知道为什么会这样。
但是如果我让它工作,那么我只需要使用fsetpos(stdout, &stream_stdout)它就可以工作。

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

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

4

3 回答 3

46
#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);
于 2012-06-14T23:08:19.043 回答
11

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

您确实需要担心fflush(stdout)在适当的时候刷新标准 I/O 流 ( ),因为您搞砸了。这意味着'在你切换标准输出之前'。

于 2012-06-14T23:13:15.893 回答
0

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

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

于 2012-06-14T22:35:15.887 回答