檔案指標指向程序使用者區的乙個叫做file結構體的東西,file結構體中有兩個重要的內容分別是檔案描述符和緩衝區;
1,檔案描述符
乙個程序開啟或者建立乙個新檔案檔案的時候返回該檔案的檔案描述符,當後讀寫檔案時將檔案描述符作為引數,檔案描述符是乙個非負的索引值,指向核心中每個程序檔案的記錄表,所有對裝置和檔案的操作都通過檔案描述符來完成。files_struct結構體中fd欄位指向乙個叫做檔案描述符表的陣列,以叫做檔案描述符陣列,該陣列的下標也就是檔案描述符,檔案描述符的分配規則是從0到n選取乙個未被分配的索引值,
當乙個程序啟動時會預設產生三個檔案描述符。
stdin (0),stdout(1),stderr(2);分別對應巨集
std_fileno
、stdout_fileno
和stderr_fileno;
所以一般來說乙個新建立的檔案的檔案描述符都是從3開始,依次排序。如果人為關掉預設開啟的檔案描述符,則新分配的檔案描述符就不是從3開始啦。核心會為每乙個程序在pcb中儲存開啟檔案的記錄表,記錄表中的每一項就是開啟檔案的索引值。linux用乙個陣列來管理開啟檔案的file物件,陣列中每乙個元素都指向開啟檔案的描述符,而陣列的下標就是檔案描述符。
稍微 解釋解釋一下乙個檔案的開啟過程;
上面說過,程序通過系統呼叫open()開啟檔案,open操作在核心裡是通過sys_open()實現,同時,sys_open將建立file對像,並在程序開啟檔案表中尋找未被使用最小
項的下標作為檔案描述符,當程序需要對乙個檔案進行讀寫操作時只要獲取檔案描述符就可以找到file物件,file物件中的f_op指向file_operation結構體,這個結構體中的成員都是函式指標,指向各種檔案操作的核心函式;
2 緩衝區;
結果顯示
使用重定向之後的·結果:
兩種結果差異是為什麼呢;
因為printf,fwrite是庫函式,庫函式預設有緩衝區,當輸出到螢幕上時,緩衝方式變為行緩衝,然而當把myfile.c的執行結果重定向到file中,緩衝方式變為全緩衝,當**執行到fork()時,緩衝區還沒有填滿,此時緩衝區內的東西對於父子程序是共享的。所以會列印兩次printf,fwrit;
檔案緩衝區
前段我把鍵盤丟了,今天我重新買了乙個鍵盤,新鍵盤拿到手後,舊鍵盤又被我找到了!我真是 現在呢,我兩個鍵盤它也沒多大用,於是我決定把新鍵盤送給我在北京的好盆友foreb。我現在有兩個送鍵盤的方案 1.我親自護送鍵盤,打車,買機票到北京,然後跑到他家,他在家的話,直接給他,不在家我再等等他,等他回來了給...
mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...
輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...