我正在使用多线程程序.
首先,我将我的stdout重定向到某个文件.这里没有问题(我用的dup2(fd, 1)
地方fd
是该文件的文件描述符).
之后,我需要再次将我的标准输出重定向到终端.
我的第一个方法:
/*Declaration*/
fpost_t stream_sdout;
/*code*/
if ( fgetpos( stdout, &stream_sdout) == -1 )
perror(Error:);
Run Code Online (Sandbox Code Playgroud)
它说非法寻求.
不知道为什么会这样.
但是,如果我fsetpos(stdout, &stream_stdout)
让它工作,那么我只需要使用它应该工作.
我的第二个想法是将stdout复制dup2(stdout, 4)
到位置4的文件描述符表.但这也不起作用.
如何将标准输出切换回其原始目标(终端,管道,文件等)?
pil*_*row 32
#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);
Run Code Online (Sandbox Code Playgroud)
在执行此操作之前dup2(fd, STDOUT_FILENO)
,您应该通过执行int saved_stdout = dup(STDOUT_FILENO);
(dup()
为您选择可用的文件描述符编号)保存标准输出的当前打开文件描述符.然后,在完成重定向到文件的输出后,您可以dup2(saved_stdout, STDOUT_FILENO)
将标准输出恢复到启动所有这些之前的位置(并且您也应该关闭saved_stdout
).
你需要担心fflush(stdout)
在适当的时候刷新标准I/O流(),因为你搞砸了.这意味着'在你将stdout切换之前'.