I O關於檔案描述符和檔案流指標

2021-09-16 21:35:08 字數 1874 閱讀 8692

fopen fwrite fread fseek fclose

open write read lseek close

程序通過struct file 結構體來描述開啟的檔案—使用了struct file* fd——array。檔案描述符就是這個陣列的下標。

使用者開啟檔案,作業系統通過file結構體描述檔案,並且將指標新增進入fd_array中,向使用者返回這個檔案描述資訊在陣列中         位置(下標),使用者操作檔案的時候將這個檔案下標傳遞給作業系統,作業系統將通過下標找到檔案描述資訊進而操作文              件。

在linux系統中開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb(process control block)             中 儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有乙個指向已開啟檔案的指標,已開啟的檔案               在 核心中用file結構體表示,檔案描述符表中的指標指向file結構體。

程序的檔案描述符是有上限的。

檔案描述符的分配規則:最小未使用原則

預設從3開始—因為乙個程序執行起來之後,缺省會開啟三個檔案:

庫函式的操作控制代碼是檔案流指標

系統呼叫介面的控制代碼是檔案描述符

檔案指標指向程序使用者區中乙個被叫做file結構的結構資料。file結構包括乙個緩衝區和乙個檔案描述符 。而檔案描述符是檔案描述符表的乙個索引,因此從某種意義上說檔案指標就是控制代碼的控制代碼(在windows系統上,檔案描述符被稱作檔案控制代碼)。

通常,任何程式執行起來之後都會預設的開啟三個標準輸入流(stdin:鍵盤),標準輸出流(stdout:顯示器),標準錯誤流(stderr:顯示器)。

簡單歸納:fd只是乙個整數,在open時產生,起到乙個索引的作用,程序通過pcb中的檔案描述符表找到該fd所指向的檔案指標file。

open:檔案描述符的操作(如:open)返回的是乙個檔案描述符(int fd),核心會在每個程序空間中維護乙個檔案描述符表,所有開啟的檔案都將通過,此表中的檔案描述符來引用。

fopen:流(如:fopen)返回的是乙個檔案指標(即指向file結構體的指標),file結構是包含有檔案描述符的,fopen可以看做是open(fd直接操作的系統呼叫)的封裝,它的優點是帶有i/o快取。

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((標準輸入)stdin),1((標準輸出)stdout),2((標準錯誤輸)stderr));

核心態和使用者態的轉化問題

使用者態切換到核心態需要使用系統呼叫:如發起系統呼叫-write read

改變資料流向,將寫入指定檔案的資料,改變之後寫入到了另乙個檔案。

重定向指的是描述符的重定向----因為描述符並沒有改變,改變的是描述符所對應的檔案資訊。

————————————————————————————————

檔案流和 檔案描述符

include apue.h int glob 6 int main void else if pid 0 i printf pid d,glob d,var d n getpid glob,var sprintf buf,d n i write stdout fileno,buf,strlen b...

檔案流和檔案描述符

檔案流和檔案描述符 檔案流和 檔案描述符 2011 10 19 16 08 apue 中的一道課後題 習題8.1 include apue.h int glob 6 int main void else if pid 0 i printf pid d,glob d,var d n getpid gl...

檔案指標和檔案描述符

原文 檔案描述符 在linux系統中,裝置也是以檔案的形式存在,要對該裝置進行操作就必須先開啟這個檔案,開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb process control block 中儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有乙個指向已開啟檔案的...