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

2021-05-27 11:48:52 字數 4624 閱讀 8849

1、系統呼叫和庫函式的關係

系統呼叫通過軟中斷int 0x80從使用者態進入核心態。

函式庫中的某些函式呼叫了系統呼叫。

函式庫中的函式可以沒有呼叫系統呼叫,也可以呼叫多個系統呼叫。

程式設計人員可以通過函式庫呼叫系統呼叫。

高階程式設計也可以直接採用int 0x80進入系統呼叫,而不必通過函式庫作為中介。

如果是在核心程式設計,也可以通過int 0x80進入系統呼叫,此時不能使用函式庫。因為函式庫中的函式是核心訪問不到的。

2、從使用者呼叫庫函式到系統呼叫執行的流程。

1) 假設使用者呼叫ssize_t write (int fields, cont void *buff, size_t nbytes);庫函式。

2) 庫函式會執行int 0x80中斷。因為中斷使得程序從使用者態進入核心態,所以引數通過

暫存器傳送。

3) 0x80中斷對應的中斷例程被稱為system call handler。其工作是:

i.  儲存大多數暫存器到核心堆疊中。這是彙編**寫的。

ii.  執行真正的系統呼叫函式――system call service routine。這是c**。

iii. 通過ret_from_sys_call ()返回,回到使用者態的庫函式。這是彙編**。

**:linux下對檔案操作有兩種方式:系統呼叫(system call)和庫函式呼叫(library functions)。可以參考《linux程式設計》(英文原版為《beginning linux programming》,作者是neil matthew和richard stones)第三章: working with files。

1、系統呼叫

系統呼叫提供的函式如open, close, read, write, ioctl等,需包含標頭檔案unistd.h。以write為例:其函式原型為 size_t write(int fd, const void *buf, size_t nbytes),其操作物件為檔案描述符或檔案控制代碼fd(file descriptor),要想寫乙個檔案,必須先以可寫許可權用open系統呼叫開啟乙個檔案,獲得所開啟檔案的fd,例如 fd=open(/"/dev/video/", o_rdwr)。fd是乙個整型值,每新開啟乙個檔案,所獲得的fd為當前最大fd加1。linux系統預設分配了3個檔案描述符值:0-standard input,1-standard output,2-standard error。

系統呼叫通常用於底層檔案訪問(low-level file access),例如在驅動程式中對裝置檔案的直接訪問。

系統呼叫是作業系統相關的,因此一般沒有跨作業系統的可移植性。

系統呼叫發生在核心空間,因此如果在使用者空間的一般應用程式中使用系統呼叫來進行檔案操作,會有使用者空間到核心空間切換的開銷。事實上,即使在使用者空間使用庫函式來對檔案進行操作,因為檔案總是存在於儲存介質上,因此不管是讀寫操作,都是對硬體(儲存器)的操作,都必然會引起系統呼叫。也就是說,庫函式對檔案的操作實際上是通過系統呼叫來實現的。例如c庫函式fwrite()就是通過write()系統呼叫來實現的。

這樣的話,使用庫函式也有系統呼叫的開銷,為什麼不直接使用系統呼叫呢?這是因為,讀寫檔案通常是大量的資料(這種大量是相對於底層驅動的系統呼叫所實現的資料操作單位而言),這時,使用庫函式就可以大大減少系統呼叫的次數。這一結果又緣於緩衝區技術。在使用者空間和核心空間,對檔案操作都使用了緩衝區,例如用fwrite寫檔案,都是先將內容寫到使用者空間緩衝區,當使用者空間緩衝區滿或者寫操作結束時,才將使用者緩衝區的內容寫到核心緩衝區,同樣的道理,當核心緩衝區滿或寫結束時才將核心緩衝區內容寫到檔案對應的硬體媒介。

2、庫函式呼叫

標準c庫函式提供的檔案操作函式如fopen, fread, fwrite, fclose, fflush, fseek等,需包含標頭檔案stdio.h。以fwrite為例,其函式原型為size_t fwrite(const void *buffer, size_t size, size_t item_num, file *pf),其操作物件為檔案指標file *pf,要想寫乙個檔案,必須先以可寫許可權用fopen函式開啟乙個檔案,獲得所開啟檔案的file結構指標pf,例如pf=fopen(/"~/proj/filename/", /"w/")。實際上,由於庫函式對檔案的操作最終是通過系統呼叫實現的,因此,每開啟乙個檔案所獲得的file結構指標都有乙個核心空間的檔案描述符fd與之對應。同樣有相應的預定義的file指標:stdin-standard input,stdout-standard output,stderr-standard error。

庫函式呼叫通常用於應用程式中對一般檔案的訪問。

庫函式呼叫是系統無關的,因此可移植性好。

由於庫函式呼叫是基於c庫的,因此也就不可能用於核心空間的驅動程式中對裝置的操作

**:

理解庫函式的區別和系統呼叫,首先要里理解unix的kernel mode和user mode。考慮下面的函式段:

int main()

int fd = create("filename",0666);

exit(0);

在執行main函式時,是在user mode下執行,當遇到create函式時,繼續在user mode下執行。然後系統將兩個引數"filenam"和"0666"壓入棧中或者某個暫存器,接著執行庫函式create。在庫函式create執行開始,系統仍然處在user mode下,接著系統將create系統呼叫的unique number壓入暫存器(比如說r0),然後執行指令trap(operating system trap)使系統進入kernel mode,並且處理系統呼叫。這時,系統意識到要進行系統呼叫的invoke,於是從暫存器r0中取出create系統呼叫的unique number,從系統呼叫表中查詢得知要invoke的系統呼叫是create,然後執行。執行完畢後返回庫函式create的呼叫,庫函式負責檢查系統呼叫的執**況(檢查某些暫存器的值),然後庫函式create根據檢查的結果返回相應的值。

在這裡,trap指令類似於乙個系統中斷,而系統呼叫create是乙個特殊的中斷處理函式(inerrupt handler)。

apue(unix環境高階程式設計)上的陳述:

所有作業系統都提供多種服務的入口點,由此程式向系統核請求服務。各種版本的unix都

提供經良好定義的有限數目的入口點,經過這些入口點進入系統核,這些入口點被稱之為

系統呼叫(system call),系統呼叫是我們不能更改的一種unix特徵。unix版本7提供了約

50個系統呼叫,4 3+bsd提供了約110個,而svr4則提供了約120個。

系統呼叫介面總是在unix程式設計師手冊的第二部分中說明。其定義也包括在c語言中。這與很 多較早期的作業系統是不同的,這些系統按傳統都在機器的組合語言中定義系統核入口點。

unix所使用的技術是為每條系統呼叫在標準c庫中設定乙個具有同樣名字的函式。使用者程序用標準c呼叫序列來呼叫這些函式,然後,函式用系統所要求的技術呼叫相應的系統核服務。

例如函式可將乙個或幾個c引數送入通用暫存器,然後執行某個產生軟中斷進入系統核的機器指令。從應用角度考慮,我們可將系統呼叫視作為c函式。

unix程式設計師手冊的第三部分定義了程式設計師可以使用的通用函式。雖然這些函式可能會呼叫乙個或幾個系統核的系統呼叫,但是它們並不是系統核的入口點。例如,printf函式會呼叫write系統呼叫以進行輸出操作,但函式strcpy(複製一字串)和atoi(變換ascii為整數)並不使用任何系統呼叫。

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

從中可見,兩者職責不同,相互分開,要核中的系統呼叫分配另外一塊空間給程序,而庫函式malloc則管理這種空間。

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

應用程式可以或者呼叫系統呼叫,或者庫函式,而很多庫函式則會呼叫系統呼叫。另乙個系統呼叫和庫函式之間的差別是:系統呼叫通常提供一種最小介面,而庫函式通常提供比較複雜的功能。我們從sbrk系統呼叫和malloc庫函式之間的差別中看到了這一點,在以後當比較不帶快取的i/o庫數(第3章)以及標準i/o標準(在第5章)時,我們還將看到這種差別。

程序控制系統呼叫(fork,exec和wait)通常由使用者的應用程式直接呼叫。(請回憶程式1.5中的基本shell)但是為了簡化某些常見的情況,unix系統也提供了一些庫函式;例如system和popen。在8.12節中,我們將說明system函式的一種實現,它使用基本的程序控制系統呼叫。在10.18中,我們還將強化這一例項以正確地處理訊號。

為使讀者了解大多數程式設計師應用的unix系統介面,我們不得不既說明系統呼叫,只介紹某些庫函式。例如若我們只說明sbrk系統呼叫,那麼就會忽略很多應用程式使用的malloc庫函式。

**:

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

1 系統呼叫和庫函式的關係 系統呼叫通過軟中斷int 0x80從使用者態進入核心態。函式庫中的某些函式呼叫了系統呼叫。函式庫中的函式可以沒有呼叫系統呼叫,也可以呼叫多個系統呼叫。程式設計人員可以通過函式庫呼叫系統呼叫。高階程式設計也可以直接採用int 0x80進入系統呼叫,而不必通過函式庫作為中介。...

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

linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,...

系統呼叫與庫函式的區別?

一.概念 系統呼叫 英語 system call 指執行在使用者空間的應用程式向作業系統核心請求某些服務的呼叫過程。系統呼叫提供了使用者程式與作業系統之間的介面。一般來說,系統呼叫都在核心態執行。由於系統呼叫不考慮平台差異性,由核心直接提供,因而移植性較差 幾乎無移植性 庫函式 library fu...