C还原标准输出到终端(C restore stdout to terminal)

2019-06-25 12:02发布

我有一个多线程程序的工作。

首先,我我的标准输出重定向到某个文件。 这里没有问题(我用dup2(fd, 1)这里fd是该文件的文件描述符)。

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

我的第一种方法:

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

它说,非法寻求。
不知道为什么会这样。
但是,如果我得到这个工作,那么我只需要使用fsetpos(stdout, &stream_stdout)它应该工作。

我的第二个想法,就是复制使用标准输出dup2(stdout, 4)该文件描述符表,在位置4.但是,这不工作要么。

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

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


Answer 2:

在你做的dup2(fd, STDOUT_FILENO)你应该做保存标准输出当前打开的文件描述符int saved_stdout = dup(STDOUT_FILENO); (让dup()为你选择一个可用的文件描述符号)。 然后,在你与重定向到一个文件输出完成之后,你可以做dup2(saved_stdout, STDOUT_FILENO)恢复标准输出到这是你开始这一切之前,(你应该关闭saved_stdout太)。

你需要担心冲洗标准I / O流( fflush(stdout)在适当的时候用这个局面)为你陷入困境。 这意味着,“你切换标准输出超过之前”。



Answer 3:

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

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



文章来源: C restore stdout to terminal
标签: c stdout