C将stdout恢复到终端

我正在使用multithreading程序。

首先,我将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)dup2(stdout, 4)复制到位置4的文件描述符表。但是这也不起作用。

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

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

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

你需要担心在适当的时候冲洗标准的I / O流( fflush(stdout) )。 这意味着’在你将stdout切换之前’。

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

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