庫函數與系統調用的區別

來源:互聯網
上載者:User
系統調用和庫函數的關係 

系統調用通過非強制中斷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 ()返回,回到使用者態的庫函數。這是彙編代碼。 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庫的,因此也就不可能用於核心空間的驅動程式中對裝置的操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.