檔案描述符
在linux系統中開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb(process control block)中儲存著乙份檔案描述符表,檔案描述符就
是這個表的索引,
其實就是檔案陣列下標
,檔案描述符是系統呼叫層次上的,每個表項都
有乙個指向已開啟檔案的指標。
檔案指標
c語言中使用的是檔案指標而不是檔案描述符做為i/o的控制代碼。檔案指標指向程序使用者區中的乙個被稱為file結構的資料結構。file結構包括乙個緩衝區和乙個檔案描述符。而檔案描述符是檔案描述符表的乙個索引,因此從某種意義上說檔案指標就是控制代碼的控制代碼(在windows系統上,檔案描述符被稱作檔案控制代碼)。file *中除了包含了fd資訊,還包含了io緩衝,是c標準形式,所以file *比fd更適合跨平台,應該多用fopen在,少用open。
c語言檔案指標與檔案描述符之間可以相互轉換:
這要通過fdopen和fileno兩個函式實現。它們都包含在標頭檔案stdio.h中。
fdopen的原型:
file * fdopen(int filedes, const char *opentype);
第乙個引數filedes是乙個開啟的檔案描述符,opentype是表示開啟方式的字串,和fopen函式具有相同的取值,比如"w"或"w+"等。但是你必須保證該字串的描述和檔案實際的開啟方式是匹配的。函式fopen()就是返回開啟檔案的指標;如果操作失敗,返回空指標null。
把檔案流指標轉換成檔案描述符用fileno函式,其原型為:
int fileno(file *stream);
它返回和stream檔案流對應的檔案描述符。如果失敗,返回-1。
當程式執行時,就已經有三個檔案流開啟了,它們分別是標準輸入stdin,標準輸出stdout和標準錯誤輸出stderr。和流式檔案相對應的是,也有三個檔案描述符被預先開啟,它們分別是0,1,2,代表標準輸入、標準輸出和標準錯誤輸出。
像上圖所示,檔案指標是檔案描述符的一層封裝,檔案指標最終呼叫的還是檔案描述符。
linux中檔案描述符fd和檔案指標flip的理解
簡單歸納 fd只是乙個整數,在open時產生。起到乙個索引的作用,程序通過pcb中的檔案描述符表找到該fd所指向的檔案指標filp。檔案描述符的操作 如 open 返回的是乙個檔案描述符,核心會在每個程序空間中維護乙個檔案描述符表,所有開啟的檔案都將通過此表中的檔案描述符來引用 而流 如 fopen...
linux中檔案描述符fd和檔案指標flip的理解
linux中檔案描述符fd和檔案指標flip的理解 簡單歸納 fd只是乙個整數,在open時產生。起到乙個索引的作用,程序通過pcb中的檔案描述符表找到該fd所指向的檔案指標filp。檔案描述符的操作 如 open 返回的是乙個檔案描述符,核心會在每個程序空間中維護乙個檔案描述符表,所有開啟的檔案都...
linux中檔案描述符fd和檔案指標flip的理解
簡單歸納 fd只是乙個整數,在open時產生。起到乙個索引的作用,程序通過pcb中的檔案描述符表找到該fd所指向的檔案指標filp。檔案描述符的操作 如 open 返回的是乙個檔案描述符,核心會在每個程序空間中維護乙個檔案描述符表,所有開啟的檔案都將通過此表中的檔案描述符來引用 而流 如 fopen...