使用dup2函数交换标准输出和文件描述符,并再次交换回来

5

以下是代码:

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;
}

我希望的效果是,将"In stdout"打印到标准输出中,将"In buffer"打印到buffer.txt文件中,然后再次将"In stdout"打印到标准输出中。
但实际上,上述代码中发生的是"In stdout"被打印到标准输出中,"In buffer"被打印到buffer.txt文件中,但最后一条"In stdout"消息无法找到。
1个回答

5
你只需要将最后一个 dup2() 更改为:
dup2(output, stdoutBack);

to...

dup2(stdoutBack, 1);

您实际上需要做的是将旧 stdout 的备份复制回 stdout 文件描述符(1),而不是改变您当前正在使用的备份(位于不同的描述符)来引用该文件。
随后,您可以关闭 stdoutBack。此外,在 dup2() 之前没有必要显式关闭 stdout,因为如果它仍然打开,dup2() 会自动关闭它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接