在學習作業系統之前,我們在操作檔案時會使用一些c介面,比如說,fwrite fread fopen fclose 這些,但是除了這些c介面(其他語言也有),我們還可以使用一些系統呼叫介面來進行檔案訪問。
例如:寫檔案(write)
**實現:
#include
#include
#include
#include
#include
#include
//往名為「myfile」的檔案裡寫入5條hello,world
讀檔案(read)**實現:
#include
#include
#include
#include
#include
#include
//往buf裡讀入5個
之前我們使用c介面操作檔案是總會用到file*,而現在我們使用系統呼叫介面發現有乙個自稱是檔案描述符的fd。下面我們就來說一說這個檔案描述符。
檔案描述符:是乙個取值為0,1,2,3,4,5,6,7,8,,9,10……的數(沒有負值)
另外,我們的c總是預設開啟3個輸入輸出流,分別是:
stdin:標準輸入
stdout:標準輸出
stderr:標準錯誤
三者分別對應於我們的鍵盤,顯示器,顯示器。
這三個流的型別都是file*,也就是說他們的返回值型別都是檔案指標。
回到檔案描述符來說,這三個對應的檔案描述符分別是:
stdin->0
stdout->1
stderr->2
linux程序預設這3個預設開啟的檔案描述符,分別是標準輸入0,標準輸出1,標準錯誤2。
當我們開啟檔案時,作業系統在記憶體中要建立相應的資料結構來描述目標檔案,於是就有了file結構體,表示乙個已經開啟的檔案物件,而程序執行open系統呼叫,所以必須讓程序和檔案關聯起來,每個程序都有乙個指標*files,指向一張表files_struct,該錶最重要的部分就是包含乙個指標陣列,每個元素都是乙個指向開啟檔案的指標,所以,本質上,檔案描述符就是該陣列的下標,所以只要拿著檔案描述符,就可以找到對應的檔案。
對於新開啟的檔案的檔案描述符的分配規則就是:在files_struct陣列當中,找到當前沒有被使用的最小的乙個下標,作為新的檔案描述符。
io相關函式與系統呼叫介面對應,並且庫函式封裝系統呼叫,所以本質上,訪問檔案都是通過fd訪問的,所以說c庫當中的file結構體內部,必定封裝了fd。
mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...
select系統呼叫 檔案描述符就緒條件
select系統呼叫原型如下 include intselect int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout 引數readfds,writefds,exceptfds引數分別指向可讀 ...
linux系統檔案描述符
了解個東西叫fd 檔案描述符,也就是window系統下的hwnd控制代碼。fd 是用乙個數字表示的。系統中維護了每個使用者,程序,系統級別的使用者檔案描述符數量許可權限制,即乙個程序可以開啟多少個檔案描述符,乙個使用者可以可以開啟多少個檔案描述符,乙個程序可以開啟多少個檔案描述符。以下命令可以檢視系...