fd與FILE結構體的縱向對比

2021-08-18 06:02:42 字數 2175 閱讀 1488

檔案描述符(fd)

對於linux而言,所有對裝置(對於linux而言,一切皆檔案)和檔案的操作都使用檔案描述符來進行的。檔案描述符是用來訪問檔案的。

檔案描述符是乙個非負的整數,是乙個索引值,指向核心中每個程序開啟檔案的記錄表。

當開啟乙個現存盤案或建立乙個新檔案時,核心就向程序返回乙個檔案描述符用於後續對檔案的讀寫操作;當需要讀檔案時,也需要把檔案描述符作為引數傳遞給相應的函式。

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

這三個檔案相對應的三個檔案描述符分別為0、1、2.所以後面如果建立新的檔案,那麼此時這個新檔案的檔案描述符就是3了。這是因為在linux中,檔案的描述符分配是從小到大逐個查詢檔案描述符是否已經使用,然後再分配。

相應的如果你提前關閉了檔案描述符1,那麼新建的檔案描述符就是1。

乙個程序的檔案描述符與對應的檔案的關係簡圖:

file結構體

c語言的stdio.h標頭檔案中,定義了用於檔案操作的結構體file。這樣,我們通過fopen返回乙個檔案指標(指向file結構體的指標)來進行檔案操作。

file結構體中最重要的兩個成員變數是:

檔案描述符和緩衝區的大小

//c語言檔案指標域檔案描述符之間可以相互轉換

int fileno(file* stream)

file* fdopen(int fd,const

char* mode)

struct _iobuf

typedef

struct _iobuf file;

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

對上圖內容的簡要介紹:

1.程序開啟乙個檔案的過程:

程序通過系統呼叫open()來開啟乙個檔案,實質上是獲得乙個檔案描述符,以便於程序通過檔案描述符來讀寫該檔案、程序開啟檔案時,會為該檔案建立乙個file物件,並將乙個指向該file物件的指標存入程序描述符表(程序描述符陣列),進而確定了開啟檔案的檔案描述符(陣列下標)。

open()系統呼叫是在核心裡通過sys_open()實現的;sys_open()將建立檔案的dentry、inode和file物件。

建立file物件時,將file物件f_op指向了所屬檔案系統的操作函式集file_operations,而該函式集又來自具體檔案的i節點,於是虛擬檔案系統就與實際檔案系統的操作銜接起來了。

並在file_struct結構體的程序開啟檔案表fd_array[nr_open_default]中查詢乙個空閒表項(也就是此時陣列中最小的未被占用的表項),然後返回該表項的下標(檔案描述符)。

2. 描述符陣列存放在程序開啟的檔案表files_struct結構體中。

檔案描述符陣列中存放了乙個程序所開啟的所有檔案

3.file_struct結構體定義:

struct files_struct ;
4.file結構體:

struct file

;

5.file結構體的幾個重要的成員變數:

f_flags:表示開啟檔案的許可權

f_pos:表示當前讀寫檔案的位置

f_count:表示開啟檔案的引用計數,如果有多個檔案指標指向他,就會增加f_count的值

f_mode:設定對檔案的訪問模式,例如:唯讀、只寫、可讀可寫等

6.小結:

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

FILE結構體與fd檔案識別符號

開啟檔案 file fopen const char path,const char mode 關閉檔案 int fclose filee fp 讀檔案 size t fread void ptr,size t size,size t nmemb,file stream 寫入檔案 size t fw...

Linux 檔案描述符fd與FILE結構體

在linux中不是用檔案指標來識別乙個檔案,而是用檔案描述符來識別的。檔案描述符簡稱fd,它是linux核心所建立的索引,目的就是為了高效管理已經被開啟的檔案。它是乙個非負整數,用來表示被開啟的檔案,而對該檔案所有的i o操作都是通過該檔案的檔案描述符來執行的。在乙個程式剛剛啟動時,系統就已經佔了三...

fd與FILE 的關係

1 file結構體的內容 struct file 結構體定義在 linux include linux fs.h 中,檔案結構體代表乙個開啟的檔案,系統中每個開啟的檔案在核心空間都有乙個關聯的 struct file 它由核心在開啟檔案時建立,並傳遞給在檔案上進行操作的任何函式。在檔案的所有例項都關...