檔案描述符
在linux中,有著一切檔案的說法,那麼在我們開啟這個檔案的時候,就會獲得該檔案的檔案描述符。
每乙個程序在pcb(task_struct)中都儲存著程序的相關資訊,用來描述程序,其中就儲存著乙份檔案描述符表,而開啟檔案獲得的這個檔案描述符。就是這個檔案描述符表的索引,在檔案描述符表中,每個表項都指向乙個已經開啟檔案的指標,其實檔案描述符表就是乙個陣列,檔案描述符就是這個描述符表的下標。
在程式執行的時候,系統會預設開啟三個輸入輸出流:標準輸入,標準輸出,標準錯誤,在三個輸入輸出流,在檔案描述符表中佔據了前三個下標,依次是0,1,2;
那麼之後,在程式中開啟mylog檔案,那麼mylog的檔案識別符號就是3,如果在程式的開始,就關閉標準輸入,標準輸出,標準錯誤其中的乙個,比如:我們用close(1),關閉標準輸出,那麼再開啟mylog檔案,它的檔案描述符就會變成1。
此時,我們也得到檔案識別符號的分配規律:從當前未被分配的最小的檔案識別符號開始分配。
但是 檔案識別符號有乙個缺點,就是平台的移植性較差,
總結:
每乙個程序在pcb中都有維護乙份檔案描述符表,也就是乙個陣列,而檔案描述符就是這個表的索引,也就是下標,當你用open函式開啟乙個檔案的時候,返回的就是這個檔案描述符在檔案描述符表中的下標,在程序中開啟的檔案都將通過檔案描述符來引用。
那麼當我們在檔案描述符表中,按照檔案描述符找到對應的表項的時候,裡面存放著乙個已開啟檔案的指標,該指標的型別是file*,指向的是乙個file結構體,而這個file結構體就是在核心中描述檔案屬性的結構體
檔案指標
在c語言中我們經常通過file* fp = fopen("test.txt","rb");來開啟乙個檔案,而我們用的指標的型別file其實是乙個結構體型別,在vc6中,給出了下面的定義
給出的這個結構體就是,在核心中描述檔案屬性的結構體,包含在stdio.h的標頭檔案中。
實際上我們在使用的時候不需要關心file的結構,file結構是間接地操縱系統的檔案控制塊(fcb)來實現對檔案的操作的在這裡我們不做過多的說明。
但是在file的結構體中,我們有注意到:int _file這個成員,他就是我們在上面提到的檔案描述符,也就是檔案描述符表的索引,之前的檔案描述符現在作為file結構體的成員,類似於於file把檔案描述符再一次封裝了一遍。
open()和fopen()的區別:
open函式:返回值是乙個檔案描述符,核心在每乙個pcb中維護乙個檔案描述符表,通過這個檔案描述符就可以知道,在表中就可以找到相關檔案。
fopen函式:返回值是乙個檔案指標,也就是指向file結構體的指標
Linux 檔案描述符和檔案指標
一 檔案描述符 1 概念 在linux下一切皆檔案的思想,檔案被分為普通檔案,目錄檔案,鏈結檔案和裝置檔案。檔案描述符是核心為了高效管理已被開啟的檔案所建立的索引,它是乙個非負整數,用於指代被開啟的檔案,所有執行i o操作的系統呼叫都要通過檔案描述符。程式剛啟動的時候,0,1,2分別表示標準輸入,標...
檔案流和 檔案描述符
include apue.h int glob 6 int main void else if pid 0 i printf pid d,glob d,var d n getpid glob,var sprintf buf,d n i write stdout fileno,buf,strlen b...
檔案指標和檔案描述符
原文 檔案描述符 在linux系統中,裝置也是以檔案的形式存在,要對該裝置進行操作就必須先開啟這個檔案,開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb process control block 中儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有乙個指向已開啟檔案的...