C語言 系統函式和庫函式的區別

2021-07-26 06:13:32 字數 1736 閱讀 8115

系統呼叫:是作業系統為使用者態執行的程序和硬體裝置(如cpu、磁碟、印表機等)進行互動提供的一組介面,即就是設定在應用程式和硬體裝置之間的乙個介面層。可以說是作業系統留給使用者程式的乙個介面。再來說一下,linux核心是單核心,結構緊湊,執行速度快,各個模組之間是直接呼叫的關係。放眼望整個linux系統,從上到下依次是使用者程序->linux核心->硬體。其中系統呼叫介面是位於linux核心中的,如果再稍微細分一下的話,整個linux系統從上到下可以是:使用者程序->系統呼叫介面->linux核心子系統->硬體,也就是說linux核心包括了系統呼叫介面和核心子系統兩部分;或者從下到上可以是:物理硬體->os核心->os服務->應用程式,其中作業系統起到「承上啟下」的關鍵作用,向下管理物理硬體,向上為操作系服務和應用程式提供介面,這裡的介面就是系統呼叫了。

一般地,作業系統為了考慮實現的難度和管理的方便,它只提供一少部分的系統呼叫,這些系統呼叫一般都是由c和彙編混合編寫實現的,其介面用c來定義,而具體的實現則是彙編,這樣的好處就是執行效率高,而且,極大的方便了上層呼叫。

庫函式:顧名思義是把函式放到庫里。是把一些常用到的函式編完放到乙個檔案裡,供別人用。別人用的時候把它所在的檔名用#include<>加到裡面就可以了。一般是放到lib檔案裡的。一般是指編譯器提供的可在c源程式中呼叫的函式。可分為兩類,一類是c語言標準規定的庫函式,一類是編譯器特定的庫函式。(由於版權原因,庫函式的源**一般是不可見的,但在標頭檔案中你可以看到它對外的介面)

libc中就是乙個c標準庫,裡面存放一些基本函式,這些基本函式都是被標準化了的,而且這些函式通常都是用彙編直接實現的。

庫函式一般可以概括的分為兩類,一類是隨著作業系統提供的,另一類是由第三方提供的。隨著系統提供的這些庫函式把系統呼叫進行封裝或者組合,可以實現更多的功能,這樣的庫函式能夠實現一些對核心來說比較複雜的操作。比如,read()函式根據引數,直接就能讀檔案,而背後隱藏的比如檔案在硬碟的哪個磁軌,哪個扇區,載入到記憶體的哪個位置等等這些操作,程式設計師是不必關心的,這些操作裡面自然也包含了系統呼叫。而對於第三方的庫,它其實和系統庫一樣,只是它直接利用系統呼叫的可能性要小一些,而是利用系統提供的api介面來實現功能(api的介面是開放的)。部分libc庫中的函式的功能的實現還是借助了系統掉呼叫,比如printf的實現最終還是呼叫了write這樣的系統呼叫;而另一些則不會使用系統呼叫,比如strlen, strcat, memcpy等。

實時上,系統呼叫所提供給使用者的是直接而純粹的高階服務,如果想要更人性化,具有更符合特定情況的功能,那麼就要我們使用者自己來定義,因此就衍生了庫函式,它把部分系統呼叫包裝起來,一方面把系統呼叫抽象了,一方面方便了使用者級的呼叫。系統呼叫和庫函式在執行的效果上很相似(當然庫函式會更符合需求),但是系統呼叫是執行於核心狀態;而庫函式由使用者呼叫,執行於使用者態。

系統呼叫是為了方便使用作業系統的介面,而庫函式則是為了人們程式設計的方便。

從實施者的角度,系統呼叫和庫函式之間有重大區別,但從使用者角度其區別並不非常重要。 兩者都對應 用程式提供服務,但是,我們應當理解,如果希望的話,我們可以代庫函式,但是通常我們卻不能代換系統服務。

另乙個可說明系統呼叫和庫函式之間的差別的例子是,unix提供決定當前時間和日期的介面。某些作業系統提供乙個系統呼叫以返回時間,而另乙個則返回日期。任何特殊的處理,例如正常時制和日光節約時制之間的轉換,由系統核處理或要求人的幹予。unix則不同,它只提供一條系統呼叫,該系統呼叫返回國際標準時公元一九七年一月一日午夜來所以經過的秒數。對該值的任何解釋,例如將其變換**們可讀的,使用本地時區的時間和日 期,都留給使用者程序執行。在標準c庫中,提供了若干例程以處理大多數情況。這些庫函式 處理各種細節,例如各種日光節約時演算法。

C語言 系統函式和庫函式的區別

系統呼叫 是作業系統為使用者態執行的程序和硬體裝置 如cpu 磁碟 印表機等 進行互動提供的一組介面,即就是設定在應用程式和硬體裝置之間的乙個介面層。可以說是作業系統留給使用者程式的乙個介面。再來說一下,linux核心是單核心,結構緊湊,執行速度快,各個模組之間是直接呼叫的關係。放眼望整個linux...

C語言 系統函式和庫函式的區別

系統呼叫 是作業系統為使用者態執行的程序和硬體裝置 如cpu 磁碟 印表機等 進行互動提供的一組介面,即就是設定在應用程式和硬體裝置之間的乙個介面層。可以說是作業系統留給使用者程式的乙個介面。再來說一下,linux核心是單核心,結構緊湊,執行速度快,各個模組之間是直接呼叫的關係。放眼望整個linux...

系統呼叫和庫函式的區別

所謂系統呼叫就是作業系統提供給應用程式的一系列介面。在linux下包含以下幾種型別 程序控制 如 fork 檔案系統控制 如 write 系統控制 如 reboot 記憶體管理 如 getpagesize 獲取頁面大小 沒見過。網路管理 getdomainname 取網域名稱 socket控制 如 ...