coding--open、fopen的差別

open是系統調用,對應無緩衝的io;fopen是C函數,對應緩衝的io,fopen會調用open實現。

程序中用openwrite打開創建並把“hello world“寫入文件test.txt,相應用fopenfwrite操作文件test2.txt

程序執行到openfopen之後,sleep 15秒,這時用ls查看生成了文件沒,這時用open打開的test.txt出現了,但是fopentest2.txt沒有;

當程序執行完writefwrite之後,fopentest2.txt仍然沒有出現(還是用ls查看),再用cattest.txt,可以看到 “helloworld”

最後再關閉test.txttest2.txt,這時test2.txt出現了,並且其內容也是“hello world”。

 

帶緩存的文件操作是標準C庫的實現,第一次調用帶緩存的文件操作函數時標準庫會自動分配內存並且讀出一段固定大小的內容存儲在緩存中。以後每次的讀寫操作並不是針對硬盤上的文件直接進行的,而是針對內存中的緩存的。何時從硬盤中讀取文件或者向硬盤中寫入文件有標準庫的機制控制。不帶緩存的文件操作通常都是系統提供的系統調用,更加低級,直接從硬盤中讀取和寫入文件,由於IO瓶頸的原因,速度並不如意,而且原子操作需要程序員自己保證,但使用得當的話效率並不差。另外標準庫中的帶緩存文件IO 是調用系統提供的不帶緩存IO實現的。

“術語不帶緩衝指的是每個read和write都調用內核中的一個系統調用。所有的磁盤I/O都要經過內核的塊緩衝(也稱內核的緩衝區高速緩存),唯一例外的是對原始磁盤設備的I/O。既然read或write的數據都要被內核緩衝,那麼術語“不帶緩衝的I/O“指的是在用戶的進程中對這兩個函數不會自動緩衝,每次read或write就要進行一次系統調用。“

--------摘自<unix環境編程>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章