linux中一切皆檔案,這句話我們都知道,可見檔案的重要性,因此檔案的管理在linux中佔據了很大比重,那麼作業系統怎麼管理檔案的呢?
要管理乙個東西,那麼必須經歷兩個步驟——描述和組織。當我們開啟乙個檔案時,系統就會生成乙個叫做file的結構體,系統正是用這個file結構體來描述單個檔案的;既然已經描述了那麼就要組織起來了,系統就會用乙個資料結構把所有的檔案都組織在一起以方便管理,而我們的程序要能訪問這些檔案,那麼這個資料結構也要與程序關聯起來。在linux中,程序與檔案的模型是這樣的:
程序的pcb中儲存著乙個指向檔案組織結構的乙個指標,而對於每個開啟的檔案,在檔案組織結構的檔案指標陣列中都會有乙個指標指向它,因此程序只要通過files指標訪問到fd_array就可以進入開啟的檔案了。
所以,當我們用open函式開啟乙個檔案時,其過程為:作業系統生成乙個新的file結構體來儲存這個檔案的資訊,並在files_struct的檔案陣列fd_array中生成乙個指向這個file結構體的指標,然後向程序返回這個指標的下標值。而這個下標值正是檔案描述符fd,在程序中也正是通過這個fd來訪問目的檔案。所以,fd就是指向所開啟檔案的指標在files_struct中的陣列 fd_array裡面的下標值。
必須注意的是files_struct與file都是在核心中存在的。file是c庫中的檔案描述結構體,這是乙個使用者層次的結構,裡面封裝了fd,其結構體定義為:
看到這裡,我們能知道,c庫中的file結構體也是通過fd來管理檔案的,當c程式用fiopen開啟乙個檔案時,其實質是通過呼叫open函式來進行操作的。也就是說file結構是對fd的封裝,而c庫中帶f的一系列io函式(如fopen)是對系統呼叫(如open)的封裝。
fd與FILE 的關係
1 file結構體的內容 struct file 結構體定義在 linux include linux fs.h 中,檔案結構體代表乙個開啟的檔案,系統中每個開啟的檔案在核心空間都有乙個關聯的 struct file 它由核心在開啟檔案時建立,並傳遞給在檔案上進行操作的任何函式。在檔案的所有例項都關...
fd與FILE結構體的縱向對比
檔案描述符 fd 對於linux而言,所有對裝置 對於linux而言,一切皆檔案 和檔案的操作都使用檔案描述符來進行的。檔案描述符是用來訪問檔案的。檔案描述符是乙個非負的整數,是乙個索引值,指向核心中每個程序開啟檔案的記錄表。當開啟乙個現存盤案或建立乙個新檔案時,核心就向程序返回乙個檔案描述符用於後...
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...