系統呼叫與標準庫IO庫函式有什麼區別

2021-10-03 20:56:10 字數 1051 閱讀 7093

linux下對檔案操作有兩種方式:系統呼叫(system call)和庫函式呼叫(library functions)。系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,第一:雙緩衝技術的實現。第二,可移植性。第三,底層呼叫本身的一些效能方面的缺陷。第四:讓api也可以有了級別和專門的工作面向。

1、系統呼叫(底層檔案訪問)

系統呼叫提供的函式如open, close, read, write, ioctl等

系統呼叫通常用於底層檔案訪問(low-level file access),例如在驅動程式中對裝置檔案的直接訪問。

系統呼叫是作業系統相關的,因此一般沒有跨作業系統的可移植性。

2、庫函式呼叫(標準io庫)

標準io庫函式提供的檔案操作函式如fopen, fread, fwrite, fclose, fflush, fseek等,

庫函式呼叫通常用於應用程式中對一般檔案的訪問。

庫函式呼叫是系統無關的,因此可移植性好。

由於庫函式呼叫是基於c庫的,因此也就不可能用於核心空間的驅動程式中對裝置的操作。

系統呼叫發生在核心空間,因此如果在使用者空間的一般應用程式中使用系統呼叫來進行檔案操作,會有使用者空間到核心空間切換的開銷。事實上,即使在使用者空間使用庫函式來對檔案進行操作,因為檔案總是存在於儲存介質上,因此不管是讀寫操作,都是對硬體(儲存器)的操作,都必然會引起系統呼叫。也就是說,庫函式對檔案的操作實際上是通過系統呼叫來實現的。例如c庫函式fwrite()就是通過write()系統呼叫來實現的。

使用庫函式也有系統呼叫的開銷,為什麼不直接使用系統呼叫呢?這是因為,讀寫檔案通常是大量的資料(這種大量是相對於底層驅動的系統呼叫所實現的資料操作單位而言),這時,使用庫函式就可以大大減少系統呼叫的次數。這一結果又緣於緩衝區技術。在使用者空間和核心空間,對檔案操作都使用了緩衝區,例如用fwrite寫檔案,都是先將內容寫到使用者空間緩衝區,當使用者空間緩衝區滿或者寫操作結束時,才將使用者緩衝區的內容寫到核心緩衝區,同樣的道理,當核心緩衝區滿或寫結束時才將核心緩衝區內容寫到檔案對應的硬體媒介。

系統I O函式與C標準庫函式

先上圖 read write函式常常被稱為 unbuffered i o。指的是無使用者輸入級緩衝區,但不保證不使用核心緩衝區。使用者程式在讀寫檔案時既可以呼叫c標準i o庫函式,也可以直接呼叫底層的系統i o函式,有什麼區別呢?c標準庫的i o緩衝區有三種型別 全緩衝 行緩衝和無緩衝。如果緩衝區寫...

系統函式I O操作與標準庫函式流操作

對於應用程式設計的i o操作 對於應用程式設計的io操作有兩種函式操作方式,一為直接呼叫系統核心的api操作列open,其次為呼叫c標準的庫函式操作列fopen。系統呼叫方式函式的返回值為控制代碼,而c庫返回的是檔案結構體指標。以下為系統呼叫方式對於open,lseek,write,read,的簡單...

基礎IO 系統呼叫和庫函式

基礎io 其他文章 待更新 1 認識檔案描述符,理解重定向。2 系統呼叫和庫函式的區別 靜態庫 動態庫 庫通俗的說就是把這些常用函式的目標檔案打包在一起,提供相應函式的介面,便於程式設計師使用。庫是別人寫好的現有的,成熟的,可以復用的 我們只需要知道其介面如何定義,便可以自如使用。庫的使用大大提高了...