linux中系統呼叫和庫函式的區別
2013-05-03 22:18:20
分類: linux
首先,要說一下兩者的概念:
系統呼叫:是作業系統為使用者態執行的程序和硬體裝置(如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等。
實時上,系統呼叫所提供給使用者的是直接而純粹的高階服務,如果想要更人性化,具有更符合特定情況的功能,那麼就要我們使用者自己來定義,因此就衍生了庫函式,它把部分系統呼叫包裝起來,一方面把系統呼叫抽象了,一方面方便了使用者級的呼叫。系統呼叫和庫函式在執行的效果上很相似(當然庫函式會更符合需求),但是系統呼叫是執行於核心狀態;而庫函式由使用者呼叫,執行於使用者態。
系統呼叫是為了方便使用作業系統的介面,而庫函式則是為了人們程式設計的方便
。
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...