最近在做tcp/ip傳輸相關專案,對於socket檔案描述符的取值範圍和分配進行了探索。
在系統標頭檔案posix_types.h中定義了檔案描述符的最大數量1024,意味著檔案描述符的取值範圍是0~1023,並且0、1、2已經被分配了,0表示標準輸入,1表示標準輸出,2表示標準錯誤輸出,而通過socket()分配的socket檔案描述符的取值範圍是從3~1023的。普通檔案描述符和socket檔案描述符是統一分配的,所以不會衝突,總數有限。如果socket()迴圈執行1020次,會從3分配到1023,如果繼續呼叫socket(),就會返回-1,因為超過了檔案描述符上限。如果此時呼叫close()關閉檔案描述符,那麼再呼叫socket(),就可以繼續成功分配了,並且是從小到大從第乙個沒有被分配的檔案描述符開始分配。
下面是示例**:
結果:
說明socket()從3~1023分配,若返回-1,表示此時已經沒有空閒的檔案描述符了。
現在嘗試,close幾個fd然後再分配,看結果。
結果:
可以發現,關閉了3,100,102,1023,再次分配fd的時候,按照從小到大順次分配未被分配的描述符。
具體的演算法不知道,但是很巧妙,這樣可以保證檔案描述符的數量不會超過系統限制,迴圈使用檔案描述符。
mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...
檔案描述符
檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...
檔案描述符
作業系統程序表中存放各個檔案進行檔案描述 核心 kernel 利用檔案描述符 file descriptor 來訪問檔案。檔案描述符是非負整數。開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。目錄檔案描述符概述 如何建立檔案描述符 使用的好處 缺點...