使用dup2将stdout与文件描述符交换,然后再返回

Bra*_*org 4 c c++ stdout dup2

这是代码:

int main()
{
  std::cout << "In stdout" << std::endl;

  int stdoutBack = dup(1);
  close(1);

  int output = open("buffer.txt", O_RDWR|O_CREAT|O_APPEND, 0777);
  dup2(output, 1);

  std::cout << "In buffer" << std::endl;

  dup2(output, stdoutBack);
  close(output);

  std::cout << "In stdout" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我想要发生的是"在标准输出"打印到标准输出,"在缓冲区"打印到buffer.txt,然后"在标准输出"再次打印到标准输出.

在上面的代码中实际发生的是"在stdout中"打印到stdout,"在缓冲区"打印到buffer.txt",但最后一个"输入stdout"消息无处可寻.

Dmi*_*tri 5

您需要做的就是更改最后一个dup2():

dup2(output, stdoutBack);
Run Code Online (Sandbox Code Playgroud)

至...

dup2(stdoutBack, 1);
Run Code Online (Sandbox Code Playgroud)

您实际需要做的是将旧stdout的备份复制回stdout文件描述符(1),而不是更改备份(位于不同的描述符上)以引用该文件(这是您当前正在执行的操作) ).

之后,你可以关闭stdoutBack.此外,之前没有必要明确关闭stdout dup2(),因为dup2()无论如何它仍然会打开.