簡體   English   中英

關閉文件描述符,然后使用它

[英]closing a file descriptor and then using it

下面的代碼段說明了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;


}

為什么我們需要關閉舊文件描述符

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

由於“ out”描述符現在已關閉,因此發送到stdout_fileno的消息也將如何寫入“ out”。

因為在dup2STDOUT_FILENO引用該文件,並且關閉fd不會關閉其克隆。

stdout,stdin,stderr是* nix系統中的所有文件。 您可以將代碼視為將“指針”指向該文件,並設置stdout指向該文件。 此時,可以刪除第一個“指針”。 這也是為什么使用prinft()的原因。 而不是fprintf();

您不需要關閉舊的文件描述符,但是該代碼可能只是作為一個示例說明您可以的。

正如其他兩個答案所述,通常,最好只打開一個文件描述符,因為這既減少了程序使用的資源量,又使您更容易看到正在使用同一文件。 (例如,您可能在循環寫入和讀取該文件時遇到問題)

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

如果檢查返回值,則可以輕松檢測到嘗試寫入已關閉的文件描述符的情況,因此最好關閉不使用的文件描述符,而不是保留它並且不要觸摸它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM