2013-05-28 59 views
0

下面是解釋dup2系統調用的代碼段。我不明白的是,在複製兩個文件描述符後,爲什麼我們需要關閉舊的文件描述符。由於「out」描述符現在被關閉,發送給stdout_fileno的消息如何被寫入「out」。請注意,代碼不是由我寫的。關閉文件描述符,然後使用它

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

int main(){ 

    int out; 
    out=open("out",O_WRONLY | O_TRUNC | O_CREAT,S_IRUSR|S_IRGRP | S_IWGRP | S_IWUSR); 

    dup2(out,STDOUT_FILENO); 
    close(out); 
    printf("now this should be written to a file called out \n"); 
    return 0; 


} 

回答

4

爲什麼我們需要關閉舊文件描述符

你並不真的需要;這個例子主要表明你可以。但是,Unix系統上的每個進程都有數量有限的文件描述符可供使用,並且當您有兩個文件描述符指向同一文件時,其中一個文件是不必要的,因此您最好關閉它。

由於「out」描述符現在已關閉,發送給stdout_fileno的消息如何寫入「out」。

因爲dup2STDOUT_FILENO指文件後的歡迎,並關閉一個FD不會關閉它的克隆。

+0

謝謝。這解釋了它 – DesirePRG

0

stdout,stdin,stderr是* nix系統中的所有文件。你可以把你的代碼看作是指向文件的「指針」,並設置stdout指向這個文件。此時,第一個「指針」可以被刪除。這也是它使用prinft()的原因。而不是fprintf();

您不需要關閉舊的文件描述符,但代碼可能是作爲一個例子顯示您可以。

正如其他答案所說,一般來說,最好只打開一個文件描述符,因爲它既減少了程序使用的資源數量,也更容易看到您正在使用相同的文件。 (例如,你可以有一個問題寫在一個循環從文件中讀取)

0

如果你有兩個描述符指向同一個文件,寫入兩者都會導致輸出隨機混合;但沒有任何錯誤可以檢測到(即寫入會成功),以告訴任何事情都是錯誤的。

如果您檢查返回值,您可以輕鬆檢測到寫入到已關閉的文件描述符的嘗試,因此最好關閉未使用的文件,而不是將其保留並小心不要觸及它。

相關問題