这是代码:
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"消息无处可寻.
您需要做的就是更改最后一个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()
无论如何它仍然会打开.
归档时间: |
|
查看次数: |
2611 次 |
最近记录: |