1. 程式人生 > >簡析檔案描述符(fd)和FILE結構體的關係

簡析檔案描述符(fd)和FILE結構體的關係

檔案描述符(fd)

檔案描述符(file descriptor)用來訪問檔案。檔案描述符是非負整數。開啟現存檔案或新建檔案時,核心會返回一個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。

通常情況下,將一個程式從硬碟載入到記憶體後,這個程式就化身為了一個程序,這時系統會預設開啟三個檔案:
標準輸入(stdin)、標準輸出(stdout)、標準錯誤(stderr)。

這三個檔案相對應的三個檔案描述符分別為0、1、2。所以後面如果建立新檔案,那麼此時這個新檔案的檔案描述符就是3,以此類推。
這是因為在Linux中,檔案的描述符分配是,從3開始,從當前最小的且未被分配的檔案描述符中分配。
這裡寫圖片描述

一個程序的檔案描述符與對應的檔案的關係圖:
這裡寫圖片描述

FILE結構體

C語言的stdio.h標頭檔案中,定義了用於檔案操作的結構體FILE。這樣,我們通過fopen返回一個檔案指標(指向FILE結構體的指標)來進行檔案操作。
FILE結構體中最重要的兩個成員變數是:
檔案描述符和緩衝區的大小

//C語言檔案指標域檔案描述符之間可以相互轉換
int fileno(FILE * stream)
FILE * fdopen(int fd, const char * mode)

struct _iobuf {
    char *_ptr;          //緩衝區當前指標
    int
_cnt; char *_base; //緩衝區基址 int _flag; //檔案讀寫模式 int _file; //檔案描述符 int _charbuf; //緩衝區剩餘自己個數 int _bufsiz; //緩衝區大小 char *_tmpfname; }; typedef struct _iobuf FILE;

FILE結構體與檔案描述符之間的關係:

這裡寫圖片描述
file結構體的幾個重要的成員變數:
f_flags:表示開啟檔案的許可權 。
f_pos:表示當前讀寫檔案的位置。
f_count:表示開啟檔案的引用計數,如果有多個檔案指標指向它,就會增加f_count的值。
f_mode:設定對檔案的訪問模式,例如:只讀,只寫、可讀可寫等。

小結:

file_struct是作業系統用來管理檔案的資料結構, 當我們建立一個程序時,會建立檔案描述符表,程序控制塊PCB中的fs指標指向檔案描述符表,
當我們建立檔案時,會為指向該檔案的指標FILE*關聯一個檔案描述符並新增在檔案描述符表中。
在檔案描述符表中fd相當於陣列的索引,FILE*相當於陣列的內容,指向一個檔案結構體。