檔案描述符在形式上是乙個非負整數。核心
(kernel)利用檔案描述符(file descriptor)來訪問檔案。開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。
實際上,它是乙個索引值,指向
核心為每乙個程序所維護的該程序開啟檔案的記錄表。當程式開啟乙個現有檔案或者建立乙個新檔案時,核心向程序返回乙個檔案描述符。在程式設計中,一些涉及底層的程式編寫往往會圍繞著檔案描述符展開。但是檔案描述符這一概念往往只適用於
unix、
linux這樣的作業系統。
習慣上,標準輸入(standard input)的檔案描述符是 0,標準輸出(standard output)是 1,標準錯誤(standard error)是 2。儘管這種習慣並非
unix核心的特性,但是因為一些 shell 和很多應用程式都使用這種習慣,因此,如果核心不遵循這種習慣的話,很多應用程式將不能使用。
posix 定義了 stdin_fileno、stdout_fileno 和 stderr_fileno 來代替 0、1、2。這三個
符號常量的定義位於標頭檔案 unistd.h。
檔案描述符的有效範圍是 0 到 open_max。一般來說,每個程序最多可以開啟 64 個檔案(0 — 63)。對於 freebsd 5.2.1、mac os x 10.3 和 solaris 9 來說,每個程序最多可以開啟檔案的多少取決於
系統記憶體的大小,int 的大小,以及系統管理員設定的限制。linux 2.4.22 強制規定最多不能超過 1,048,576 。
檔案描述符是由
無符號整數表示的控制代碼,程序使用它來標識開啟的檔案。檔案描述符與包括相關資訊(如檔案的開啟模式、檔案的位置型別、檔案的初始型別等)的檔案物件相關聯,這些資訊被稱作檔案的上下文。
如何建立檔案描述符
程序獲取檔案描述符最常見的方法是通過本機
子例程open或create獲取或者通過從
父程序繼承。後一種方法允許子程序同樣能夠訪問由父程序使用的檔案。檔案描述符對於每個程序一般是唯一的。當用fork子例程建立某個子程序時,該子程序會獲得其父程序所有檔案描述符的副本,這些檔案描述符在執行fork時開啟。在由fcntl、dup和
dup2子例程複製或拷貝某個程序時,會發生同樣的複製過程。
對於每個程序,作業系統
核心在u_block結構中維護檔案描述符表,所有的檔案描述符都在該表中建立索引。
關於檔案描述符
在linux下進行read和write時,發現當返回乙個檔案描述符,對它進行write操作,之後馬上read,讀出來的資料都是0,當時很奇怪,因為檔案描述符只是乙個int型的整數,不同於c下的fwrite,是直接返回乙個檔案指標,每次讀寫這個指標也會隨之而變化,於是查詢了關於檔案描述符的資料。檔案描...
關於檔案描述符
關於檔案描述符 檔案描述符 file struct 是乙個非負整數,對於linux核心而言,為了高效管理已經被開啟的檔案所建立的索引,作業系統在每個程序描述符中都提供了檔案描述符表。檔案描述符表中每個表項都有乙個指向已經開啟檔案的指標 而已經開啟的檔案在核心中用file結構體表示,檔案描述符中的指標...
mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...