系統呼叫、posix、c庫、系統命令和核心函式
2023年12月06日
[b]系統呼叫、posix、c庫、系統命令和核心函式[/b]
[b](1)系統呼叫和posix。[/b]
系統呼叫雖然是核心和使用者應用程式之間的溝通橋梁,是使用者應用程式訪問核心的入口點,但通常情況下,應用程式是通過作業系統提供的應用程式設計介面(api)而不是直接通過系統呼叫來程式設計。
作業系統api的主要作用是把作業系統的功能完全展示出來,提供給應用程式,基於該作業系統,與檔案、記憶體、時鐘、網路、圖形、各種外設等互操作的能力。此外,作業系統api通常還提供許多任務具類的功能,比如操縱字串、各種資料型別、時間日期等。
在unix世界裡,最通用的作業系統api基於posix(portable operating system inte***ce of unix,可移植作業系統介面)標準。posix的誕生和unix的發展密不可分,unix於20世紀70年代誕生於bell lab,並於20世紀80年代向美各大高校分發v7版的原始碼以做研究。uc berkeley在v7的基礎上開發了bsd unix。
後來很多商業廠家意識到unix的價值也紛紛以bell lab的system v或bsd為基礎來開發自己的unix,較著名的有sun os、aix、vms等。雖然這帶來了unix的繁榮,但由於各廠家對unix的開發各自為政,unix的版本相當混亂,給軟體的可移植性帶來很大困難,對unix的發展極為不利。
為結束這種局面,ieee制訂了posix標準,目標是提供一套大體上基於unix的可移植作業系統標準,提高unix環境下應用程式的可移植性。然而,posix並不侷限於unix。許多其他的作業系統,例如dec openvms和microsoft windows nt,都支援posix標準
posix標準定義了"posix相容"的作業系統所必須提供的服務。linux相容於posix標準,提供了根據posix而定義的api函式。這些api函式和系統呼叫之間有著直接的關係,乙個api函式可以由乙個系統呼叫實現,也可以通過呼叫多個系統呼叫來實現,還可以完全不使用任何系統呼叫。
[b](2)系統呼叫和c庫。[/b]
作業系統api通常都以c庫的方式提供,linux也是如此。c庫提供了posix的絕大部分api,同時,核心提供的每個系統呼叫在c庫中都具有相應的封裝函式。系統呼叫與其c庫封裝函式的名稱常常相同,比如,read系統呼叫在c庫中的封裝函式即為read函式。
c庫中的系統呼叫封裝函式在最終呼叫到相應系統呼叫之前,往往不做多少額外的工作。不過,某些情況下會有些例外,比如對於兩個相關的系統呼叫truncate和truncate64,c庫中的封裝函式truncate函式即需要決定它們中的哪個應該最終被呼叫。
當然,如圖5.1所示,系統呼叫和c庫函式之間並不是一一對應的關係。可能幾個不同的函式會呼叫到同乙個系統呼叫,比如malloc函式和free函式都是通過brk系統呼叫來擴大或縮小程序的堆疊,execl、execlp、execle、execv、execvp和execve函式都是通過execve系統呼叫來執行乙個可執行檔案。
也有可能乙個函式呼叫多個系統呼叫。更有些函式並不依賴於任何系統呼叫,比如strcpy函式(複製字串)和atoi函式**換ascii為整數),因為它們並不需要向核心請求任何服務。
498)this.style.width=498;" height=240> 圖5.1 c庫函式與系統呼叫
實際上,從使用者的角度看,系統呼叫和c庫之間的區別並不重要,他們只需通過c庫函式完成所需功能。相反,從核心的角度看,需要考慮的則是提供哪些針對確定目的的系統呼叫,並不需要關注它們如何被使用。
[b](3)系統呼叫與系統命令。[/b]
系統命令位於c庫的更上層,是利用c庫實現的可執行程式,比如最為常用的ls、cd等命令。
strace工具可以跟蹤命令的執行,使用希望跟蹤的命令為引數,並顯示出該命令執行過程中所使用到的所有系統呼叫。比如,如果希望了解在執行pwd命令時都呼叫了哪些系統呼叫,可以使用下面的命令:
$strace pwd
結果會產生大量的資訊,顯示出pwd命令執行過程中所呼叫到的各個系統呼叫:
…… write(1, "/usr/src/linux-2.6.23\n", 22/usr/src/linux-2.6.23) = 22 close(1) = 0 munmap(0xb7f5a000, 4096) = 0 exit_group(0)
[b](4)系統呼叫和核心函式。[/b]
核心函式與c庫函式的區別僅僅是核心函式在核心實現,因此必須遵守核心程式設計的規則。
系統呼叫最終必須具有明確的操作。使用者應用程式通過系統呼叫進入核心後,會執行各個系統呼叫對應的核心函式,即系統呼叫服務例程,比如系統呼叫getpid的服務例程是核心函式sys_getpid。
系統呼叫服務例程之外,核心中存在著大量的核心函式。有些侷限於某個核心檔案自己使用,有些則是export出來供核心其他部分共同使用。對於export出來的核心函式,可以使用ksyms命令或通過/proc/ksyms檔案檢視。
系統呼叫 POSIX C庫 系統命令和核心函式
系統呼叫 posix c庫 系統命令和核心函式 1 系統呼叫和posix。系統呼叫雖然是核心和使用者應用程式之間的溝通橋梁,是使用者應用程式訪問核心的入口點,但通常情況下,應用程式是通過作業系統提供的應用程式設計介面 api 而不是直接通過系統呼叫來程式設計。作業系統api的主要作用是把作業系統的功...
系統呼叫 POSIX C庫 系統命令和核心函式
系統呼叫 posix c庫 系統命令和核心函式 2010年12月06日 b 系統呼叫 posix c庫 系統命令和核心函式 b b 1 系統呼叫和posix。b 系統呼叫雖然是核心和使用者應用程式之間的溝通橋梁,是使用者應用程式訪問核心的入口點,但通常情況下,應用程式是通過作業系統提供的應用程式設計...
系統呼叫 POSIX C庫 系統命令和核心函式
系統呼叫 posix c庫 系統命令和核心函式 2010年12月06日 b 系統呼叫 posix c庫 系統命令和核心函式 b b 1 系統呼叫和posix。b 系統呼叫雖然是核心和使用者應用程式之間的溝通橋梁,是使用者應用程式訪問核心的入口點,但通常情況下,應用程式是通過作業系統提供的應用程式設計...