在linux下進行read和write時,發現當返回乙個檔案描述符,對它進行write操作,之後馬上read,讀出來的資料都是0,當時很奇怪,因為檔案描述符只是乙個int型的整數,不同於c下的fwrite,是直接返回乙個檔案指標,每次讀寫這個指標也會隨之而變化,於是查詢了關於檔案描述符的資料。
檔案描述符在形式上是乙個非負整數。實際上,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。核心對所有開啟的檔案的檔案維護有乙個系統級的描述符**(open file description table)。有時,也稱之為開啟檔案表(openfile table),並將**中各條目稱為開啟檔案控制代碼(open file handle)。乙個開啟檔案控制代碼儲存了與乙個開啟檔案相關的全部資訊,如下所示:
1. 當前檔案偏移量(呼叫read()和write()時更新,或使用lseek()直接修改)
2. 開啟檔案時所使用的狀態標識(即,open()的flags引數)
3. 檔案訪問模式(如呼叫open()時所設定的唯讀模式、只寫模式或讀寫模式)
4. 與訊號驅動相關的設定
5. 對該檔案i-node物件的引用
6. 檔案型別(例如:常規檔案、套接字或fifo)和訪問許可權
7. 乙個指標,指向該檔案所持有的鎖列表
8. 檔案的各種屬性,包括檔案大小以及與不同型別操作相關的時間戳
可以看到雖然檔案描述符是乙個固定的int變數,但實際它還對應這乙個表,裡面記錄著開啟的檔案的偏移量就當做檔案指標吧、,當你write或read是,這個量會變化,write之後,檔案描述符所對應的開啟檔案 偏移量會發生變化,所以在write之後用lseek函式將偏移量再往上指向檔案開頭 再read就可以了。
關於檔案描述符
檔案描述符在形式上是乙個非負整數。核心 kernel 利用檔案描述符 file descriptor 來訪問檔案。開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。實際上,它是乙個索引值,指向 核心為每乙個程序所維護的該程序開啟檔案的記錄表。當程式開...
關於檔案描述符
關於檔案描述符 檔案描述符 file struct 是乙個非負整數,對於linux核心而言,為了高效管理已經被開啟的檔案所建立的索引,作業系統在每個程序描述符中都提供了檔案描述符表。檔案描述符表中每個表項都有乙個指向已經開啟檔案的指標 而已經開啟的檔案在核心中用file結構體表示,檔案描述符中的指標...
mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...