linux系統呼叫 庫函式和核心函式關係與區別

2021-07-22 01:46:31 字數 895 閱讀 9601

看系統呼叫,還有庫函式,以前一直不明白,總是以為 系統呼叫跟庫函式是一樣的,但是今天才知道是不一樣的。

庫函式也就是我們通常所說的應用程式設計介面api,它其實就是乙個函式定義,比如常見read()、write()等函式說明了如何獲得乙個給定的服務,但是系統呼叫是通過軟中斷向核心發出乙個明確的請求,再者系統呼叫是在核心完成的,而使用者態的函式是在函式庫完成的。

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

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

系統呼叫與系統命令:系統命令相對api更高一層,每個系統命令都是乙個可執行程式,比如常用的系統命令ls、hostname等,比如strace ls就會發現他們呼叫了諸如open(),brk(),fstat(),ioctl()等系統呼叫。

系統呼叫是使用者程序進入核心的介面層,它本身並非核心函式,但他是由核心函式實現的,進入系統核心後,不同的系統呼叫會找到各自對應的核心函式,這寫核心函式被稱為系統呼叫的「服務例程」。也可以說系統呼叫是服務例程的封裝例程。

Linux系統呼叫和庫函式呼叫

linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 可以參考 linux程式設計 英文原版為 beginning linux programming 作者是neil matthew和richard stones 第三章 working...

Linux系統呼叫和庫函式呼叫

linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 可以參考 linux程式設計 英文原版為 beginning linux programming 作者是neil matthew和richard stones 第三章 working...

linux系統呼叫和庫函式呼叫

linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 可以參考 linux程式設計 英文原版為 beginning linux programming 作者是neil matthew和richard stones 第三章 working...