系統呼叫和庫函式的區別

2021-07-26 05:16:42 字數 1360 閱讀 1554

系統呼叫:是作業系統為使用者態執行的程序和硬體裝置(如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等。

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

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

庫函式呼叫和系統呼叫的區別

庫函式是語言本身的一部分,而系統函式是核心提供給應用程式的介面,屬於系統的一部分。函式庫呼叫是語言或應用程式的一部分,而系統呼叫是作業系統的一部分。函式庫呼叫 系統呼叫 在所有的ansi c編譯器版本中,c庫函式是相同的 各個作業系統的系統呼叫是不同的 它呼叫函式庫中的一段程式 或函式 它呼叫系統核...

系統呼叫和庫函式的區別

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

庫函式和系統呼叫的區別

unix作業系統設計上的陳述 理解庫函式的區別和系統呼叫,首先要里理解unix的kernel mode和user mode。考慮下面的函式段 int main int fd create filename 0666 exit 0 在執行main函式時,是在user mode下執行,當遇到create...