標準io和系統io的辨析
基本概念
由於Linux系統下“一切皆檔案”,也就是Linux系統下的資料和程式都是以檔案的形式儲存的,所以Linux核心會提供一組操作檔案的函式介面,這組函式介面也被稱為系統IO。
同時為了滿足使用者訪問檔案的需求以及提高使用者程式的可移植性,標準庫也提供了一組操作檔案的函式介面,這組函式介面也被稱為標準IO,只不過標準庫提供的標準IO函式都是遵循ANSI C標準設計出來,是為了方便使用者在不同的作業系統下可以呼叫通用的函式來實現對檔案的讀寫訪問,但其實標準IO也是基於核心提供的系統IO設計出來的。
兩者區別
標準io提供了緩衝區並且函式介面 十分豐富,緩衝區的設立可以避免頻繁的系統呼叫,且不用認為關心緩衝區的大小,整體上提高了io的效率。但相對的沒有辦法對某些型別的檔案進行訪問(套接字檔案,連結檔案,驅動裝置檔案等),因而適合訪問普通檔案。
系統io不具備輸入輸出緩衝區,因而無法高效處理檔案,原因是系統io的呼叫需要更多的時間,系統io呼叫的過程中核心要執行一系列的操作:首先核心需要捕獲呼叫,然後再檢查系統呼叫傳遞的引數的有效性,最後在使用者空間和核心空間之間傳輸資料。系統io的有點是可以針對特定的檔案型別進行訪問,因而適合訪問資料實時重新整理的硬體裝置。
簡單理解:標準I/O可以看成是在系統I/O的基礎上封裝了緩衝機制。這樣可以先讀寫緩衝區,必要時再訪問實際檔案,從而減少了系統呼叫的次數,提高訪問效率。
write() --> a.txt -->write(buf,1,1,fp); --> write() --> 100個位元組要寫--> 呼叫100次write() -->慢
fwrite() --> a.txt -->fwrite(buf,1,100,fp); -->write() -->100個位元組要寫-->呼叫001次write() -->快