本文,**系統呼叫和庫函式呼叫的異同。(以檔案操作為例,詳情參考)
linux
系統呼叫和
ansi c
檔案操作的區別
我們知道在
linux
下對檔案操作有兩種方式:
linux
系統呼叫和
ansi c
檔案操作。
linux
系統呼叫指最底層的乙個呼叫,在
linux
程式設計裡面就是底層呼叫, 面向的是硬體。
ansi c
是庫函式呼叫,面向的是應用開發的,相當於應用程式的
程式的api
(應用程式介面)。
採用這樣的方式有很多種原因:
第一, 雙緩衝技術的實現;
第二,可移植性的考慮; 第
三,底層呼叫本身的一些效能缺陷(如頻繁擦寫影響檔案儲存介質的壽命);
第四, 讓
api也可以有具體分層和專門的應用方向。
linux
系統呼叫
linux
系統呼叫是作業系統相關的,因此一般沒有跨作業系統的可移植性。
linux
系統呼叫發生在核心空間,因此如果在使用者空間的一般應用程式中使用系統呼叫
來進行檔案操作,會有使用者空間到核心空間切換的開銷。
事實上,即使在使用者空間使用
ansi
c檔案操作,因為檔案總是存在於儲存介質上,因此不管是讀寫操作,都是對硬體
(儲存器
)的操作,都必然會引起
linux
系統呼叫。
也就是說,
ansi c
檔案操作實際上是通過系統調
用來實現的。例如c
庫函式
fwrite()
就是通過
write()
系統呼叫來實現的。
這樣的話,使用庫函式也有系統呼叫的開銷,為什麼不直接使用系統呼叫呢?
因為讀寫檔案通常是大量的資料
(這種大量是相對於底層驅動的系統呼叫所實現的資料操作單位而言)
, 這時,使用
ansi c
檔案操作就可以大大減少系統呼叫的次數。
這一結果又緣於緩
沖區技術。
在使用者空間和核心空間,對檔案操作都使用了緩衝區,例如用
fwrite
寫檔案,都是先將內容寫到使用者空間緩衝區,當使用者空間緩衝區滿或者寫操作結束時,才將使用者緩衝區的內容寫到核心緩衝區。
同樣的道理,當核心緩衝區滿或寫結束時才將核心緩衝區內容寫到檔案對應的硬體媒介。
ansi c
檔案操作
ansi c
檔案操作通常用於應用程式中對一般檔案的訪問。
ansi c
檔案操作是系統無關的,因此可移植性好, 由於
ansi c
檔案操作是基於
c 庫的,因此也就不可能用於核心空間的驅動程式中對裝置的操作。
系統呼叫與庫函式呼叫
linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,...
庫函式與系統呼叫
系統呼叫 通常shell是通過系統呼叫將底層硬體功能向上層應用程式提供,linux的系統呼叫約有300多個 因為系統呼叫不考慮平台差異性,由核心直接提供,因此移植性較差。庫函式庫函式是由使用者或組織自己開發的,具有一定功能的函式集合 例如,如果使用者要讓音效卡發生,可能要呼叫好多個系統呼叫,而且系統...
系統呼叫與庫函式
大部分的i o軟體放在作業系統內部,但仍有一小部分在使用者層,其中包括與使用者程式鏈結在一起的庫函式,以及完全執行在核心之外的假離線系統 一方面,為使各個程序有條不紊地使用i o裝置,且能保護裝置的安全性,不允許在使用者態的應用程式去直接呼叫在核心態的os。但另一方面,應用程式在執行時,又必須取得o...