我正在使用多线程程序。
首先,我将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的文件描述符表。但是这也不起作用。
如何将标准输出切换回原始目的地(终端,管道,文件等)?
答案 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。