以下是代码:
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;
}
我想要发生的是“在标准输出中”打印到标准输出,“在缓冲区”打印到buffer.txt,然后“在标准输出”再次打印到标准输出。
上面代码中实际发生的事情是“在stdout中”打印到stdout,“在缓冲区中”打印到buffer.txt“,但最后一个”输入stdout“消息无处可寻。
答案 0 :(得分:5)
您需要做的就是更改上一个dup2()
:
dup2(output, stdoutBack);
为...
dup2(stdoutBack, 1);
你真正需要做的是将旧stdout的备份复制回stdout文件描述符(1),而不是更改你的备份(在不同的描述符上)来引用文件(这就是你&# 39;目前正在做。)
之后,您可以关闭stdoutBack
。此外,无需在dup2()
之前明确关闭标准输出,因为dup2()
无论如何都会打开它。