[Linux]read/write和fread/fwrite有什么區別


 轉自:http://blog.csdn.net/xiaofei0859/article/details/51145051

二者都是對文件進行操作,那么二者有什么區別,用的時候該如何選擇呢?

1. 區別

  • fread是帶緩沖的,read不帶緩沖.
  • fopen是標准c里定義的,open是POSIX中定義的.
  • fread可以讀一個結構.read在Linux/unix中讀二進制與普通文件沒有區別.
  • fopen不能指定要創建文件的權限.open可以指定權限.
  • fopen返回指針,open返回文件描述符(整數).
  • linux/unix中任何設備都是文件,都可以用open,read.

如果文件的大小是8k

你如果用read/write,且只分配了2k的緩存,則要將此文件讀出需要做4次系統調用來實際從磁盤上讀出。

如果你用fread/fwrite,則系統自動分配緩存,則讀出此文件只要一次系統調用從磁盤上讀出。

也就是用read/write要讀4次磁盤,而用fread/fwrite則只要讀1次磁盤。效率比read/write要高4倍。

如果程序對內存有限制,則用read/write比較好。

都用fread 和fwrite,它自動分配緩存,速度會很快,比自己來做要簡單。如果要處理一些特殊的描述符,用read 和write,如套接口,管道之類的

系統調用write的效率取決於你buf的大小和你要寫入的總數量,如果buf太小,你進入內核空間的次數大增,效率就低下。而fwrite會替你做緩存,減少了實際出現的系統調用,所以效率比較高。

如果只調用一次(可能嗎?),這倆差不多,嚴格來說write要快一點點(因為實際上fwrite最后還是用了write做真正的寫入文件系統工作),但是這其中的差別無所謂。

2.來自論壇的解釋

fread帶緩存指的是應用層帶緩存,read也是帶了緩存但是指的是系統層或者說kernel層,當然也可能不帶,比如直接DMA,由驅動決定。

fread是標准庫的緩沖,read是內核的緩沖。

read/write如果可以精確控制一次讀寫的數據,則會比fread/fwrite更加高效

read/write對應Linux中的system call, 而fread/fwrite則可以說是對read/write的又一次封裝,read/write更加原生,如果不考慮跨平台,建議多使用read/write.

舉個例子

做如下步驟的操作:

  1. 打開文件
  2. 讀文件的0k~4k(read or fread)
  3. 其他操作
  4. 讀文件的1k~3k(read or fread)
  5. 關閉文件

這時候如果是read,步驟4要調用內核;而如果是fread,因步驟2在應用層已經緩沖所需內容,數據會直接返回,無需再次調用內核


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM