系統調用、POSIX、C庫、系統命令和內核函數

系統調用、POSIX、C庫、系統命令和內核函數

(1)系統調用和POSIX。

系統調用雖然是內核和用戶應用程序之間的溝通橋樑,是用戶應用程序訪問內核的入口點,但通常情況下,應用程序是通過操作系統提供的應用編程接口(API)而不是直接通過系統調用來編程。 操作系統API的主要作用是把操作系統的功能完全展示出來,提供給應用程序,基於該操作系統,與文件、內存、時鐘、網絡、圖形、各種外設等互操作的能力。此外,操作系統API通常還提供許多工具類的功能,比如操縱字符串、各種數據類型、時間日期等。 在UNIX世界裏,最通用的操作系統API基於POSIX(Portable Operating System Interface of UNIX,可移植操作系統接口)標準。 POSIX是一套操作系統接口的標準,POSIX標準定義了”POSIX兼容”的操作系統所必須提供的服務,提供了根據POSIX而定義的API 函數。這些API函數和系統調用之間有着直接的關係,一個API函數可以由一個系統調用實現,也可以通過調用多個系統調用來實現,還可以完全不使用任何系 統調用。

(2)系統調用和C庫。

操作系統API通常都以C庫的方式提供,Linux也是如此。C庫提供了POSIX的絕大部分API,同時,內核提供的每個系統調用在C庫中都具有相應的封裝函數。系統調用與其C庫封裝函數的名稱常常相同,比如,read系統調用在C庫中的封裝函數即爲read函數。 C庫中的系統調用封裝函數在最終調用到相應系統調用之前,往往不做多少額外的工作。不過,某些情況下會有些例外,比如對於兩個相關的系統調用truncate和truncate64,C庫中的封裝函數truncate函數即需要決定它們中的哪個應該最終被調用。 系統調用和C庫函數之間並不是一一對應的關係。可能幾個不同的函數會調用到同一個系統調用,比如malloc函數和 free函數都是通過brk系統調用來擴大或縮小進程的堆棧,execl、execlp、execle、execv、execvp和execve函數都是 通過execve系統調用來執行一個可執行文件。 也有可能一個函數調用多個系統調用。更有些函數並不依賴於任何系統調用,比如strcpy函數(複製字符串)和atoi函數(轉換ASCII爲整數),因爲它們並不需要向內核請求任何服務。實際上,從用戶的角度看,系統調用和C庫之間的區別並不重要,他們只需通過C庫函數完成所需功能。相反,從內核的角度看,需要考慮的則是提供哪些針對確定目的的系統調用,並不需要關注它們如何被使用。

(3)系統調用與系統命令。

系統命令位於C庫的更上層,是利用C庫實現的可執行程序,比如最爲常用的ls、cd等命令。 strace工具可以跟蹤命令的執行,使用希望跟蹤的命令爲參數,並顯示出該命令執行過程中所使用到的所有系統調用。

(4)系統調用和內核函數。

內核函數與C庫函數的區別僅僅是內核函數在內核實現,因此必須遵守內核編程的規則。 系統調用最終必須具有明確的操作。用戶應用程序通過系統調用進入內核後,會執行各個系統調用對應的內核函數,即系統調用服務例程,比如系統調用getpid的服務例程是內核函數sys_getpid。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章