C将stdout恢复到终端

Ale*_*ire 20 c stdout

我正在使用多线程程序.

首先,我将我的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)

  • 我打字的时候,你是在读我的肩膀吗? (2认同)
  • @ThinkBonobo,`saved_stdout` 是程序标准输出下原始文件的原始文件描述符的副本(因此,*dup()*)。当它再次复制回 (*dup2()*) 标准输出(文件描述符 1)时,程序有两个副本/句柄/描述符用于相同的底层文件。一旦输出重定向完成,就不需要这样做(它可能会混淆资源限制或关于文件锁的假设等),所以好的做法是在不再需要资源时关闭资源。 (2认同)

Jon*_*ler 8

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

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

  • STDOUT_FILENO的+1使它更具可读性. (3认同)