2014-10-31 71 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()無論如何都會這樣做,如果它仍然是開放的。

相關問題