2014-10-31 54 views
3

下面是代码:使用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; 
} 

我想什么发生的是“在标准输出”被打印到标准输出,“在缓冲区”打印到buffer.txt,然后“输出stdout”再次打印到标准输出。

实际发生在上面的代码“以标准输出”被打印到标准输出什么,“以缓冲液”被打印到buffer.txt”,但最后‘以标准输出’消息是无处被发现。

回答

4

所有你需要做的是改变过去dup2()来自:

dup2(output, stdoutBack); 

到...

dup2(stdoutBack, 1); 

你真正需要做的是复制你的旧的备份标准输出放回ST dout文件描述符(1),不要更改您的备份(位于不同的描述符上)以引用该文件(这是您当前正在执行的操作)。

之后,您可以关闭stdoutBack。另外,不需要在dup2()之前明确地关闭标准输出,因为dup2()无论如何都会这样做,如果它仍然是开放的。

相关问题