欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

linux 系統(tǒng)調(diào)用與標(biāo)準(zhǔn)庫調(diào)用的區(qū)別詳細解析

 更新時間:2013年08月23日 09:58:22   作者:  
以下是對linux中系統(tǒng)調(diào)用與標(biāo)準(zhǔn)庫調(diào)用的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下

1、系統(tǒng)調(diào)用和庫函數(shù)的關(guān)系
系統(tǒng)調(diào)用通過軟中斷int 0x80從用戶態(tài)進入內(nèi)核態(tài)。 函數(shù)庫中的某些函數(shù)調(diào)用了系統(tǒng)調(diào)用。
函數(shù)庫中的函數(shù)可以沒有調(diào)用系統(tǒng)調(diào)用,也可以調(diào)用多個系統(tǒng)調(diào)用。 編程人員可以通過函數(shù)庫調(diào)用系統(tǒng)調(diào)用。

高級編程也可以直接采用int 0x80進入系統(tǒng)調(diào)用,而不必通過函數(shù)庫作為中介。 如果是在核心編程,也可以通過int 0x80進入系統(tǒng)調(diào)用,此時不能使用函數(shù)庫。因為函數(shù)庫中的函數(shù)是內(nèi)核訪問不到的。 

2、從用戶調(diào)用庫函數(shù)到系統(tǒng)調(diào)用執(zhí)行的流程。
1) 假設(shè)用戶調(diào)用ssize_t write (int fields, cont void *buff, size_t nbytes);庫函數(shù)。
2) 庫函數(shù)會執(zhí)行int 0x80中斷。因為中斷使得進程從用戶態(tài)進入內(nèi)核態(tài),所以參數(shù)通過寄存器傳送。
3) 0x80中斷對應(yīng)的中斷例程被稱為system call handler。

其工作是:
i.  存儲大多數(shù)寄存器到內(nèi)核堆棧中。這是匯編代碼寫的。
ii.  執(zhí)行真正的系統(tǒng)調(diào)用函數(shù)――system call service routine。這是C代碼。 
iii. 通過ret_from_sys_call ()返回,回到用戶態(tài)的庫函數(shù)。這是匯編代碼。

1、系統(tǒng)調(diào)用
系統(tǒng)調(diào)用提供的函數(shù)如open, close, read, write, ioctl等,需包含頭文件unistd.h。以write為例:其函數(shù)原型為 size_t write(int fd, const void *buf, size_t nbytes),其操作對象為文件描述符或文件句柄fd(file descriptor),要想寫一個文件,必須先以可寫權(quán)限用open系統(tǒng)調(diào)用打開一個文件,獲得所打開文件的fd,例如 fd=open(/"/dev/video/", O_RDWR)。fd是一個整型值,每新打開一個文件,所獲得的fd為當(dāng)前最大fd加1。

Linux系統(tǒng)默認分配了3個文件描述符值:
0-standard input,1-standard output,2-standard error。
系統(tǒng)調(diào)用通常用于底層文件訪問(low-level file access),例如在驅(qū)動程序中對設(shè)備文件的直接訪問。
系統(tǒng)調(diào)用是操作系統(tǒng)相關(guān)的,因此一般沒有跨操作系統(tǒng)的可移植性。

系統(tǒng)調(diào)用發(fā)生在內(nèi)核空間,因此如果在用戶空間的一般應(yīng)用程序中使用系統(tǒng)調(diào)用來進行文件操作,會有用戶空間到內(nèi)核空間切換的開銷。事實上,即使在用戶空間使用庫函數(shù)來對文件進行操作,因為文件總是存在于存儲介質(zhì)上,因此不管是讀寫操作,都是對硬件(存儲器)的操作,都必然會引起系統(tǒng)調(diào)用。也就是說,庫函數(shù)對文件的操作實際上是通過系統(tǒng)調(diào)用來實現(xiàn)的。例如C庫函數(shù)fwrite()就是通過write()系統(tǒng)調(diào)用來實現(xiàn)的。

這樣的話,使用庫函數(shù)也有系統(tǒng)調(diào)用的開銷,為什么不直接使用系統(tǒng)調(diào)用呢?這是因為,讀寫文件通常是大量的數(shù)據(jù)(這種大量是相對于底層驅(qū)動的系統(tǒng)調(diào)用所實現(xiàn)的數(shù)據(jù)操作單位而言),這時,使用庫函數(shù)就可以大大減少系統(tǒng)調(diào)用的次數(shù)。這一結(jié)果又緣于緩沖區(qū)技術(shù)。在用戶空間和內(nèi)核空間,對文件操作都使用了緩沖區(qū),例如用fwrite寫文件,都是先將內(nèi)容寫到用戶空間緩沖區(qū),當(dāng)用戶空間緩沖區(qū)滿或者寫操作結(jié)束時,才將用戶緩沖區(qū)的內(nèi)容寫到內(nèi)核緩沖區(qū),同樣的道理,當(dāng)內(nèi)核緩沖區(qū)滿或?qū)懡Y(jié)束時才將內(nèi)核緩沖區(qū)內(nèi)容寫到文件對應(yīng)的硬件媒介。

2、庫函數(shù)調(diào)用
標(biāo)準(zhǔn)C庫函數(shù)提供的文件操作函數(shù)如fopen, fread, fwrite, fclose, fflush, fseek等,需包含頭文件stdio.h。以fwrite為例,其函數(shù)原型為size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其操作對象為文件指針FILE *pf,要想寫一個文件,必須先以可寫權(quán)限用fopen函數(shù)打開一個文件,獲得所打開文件的FILE結(jié)構(gòu)指針pf,例如pf=fopen(/"~/proj/filename/", /"w/")。實際上,由于庫函數(shù)對文件的操作最終是通過系統(tǒng)調(diào)用實現(xiàn)的,因此,每打開一個文件所獲得的FILE結(jié)構(gòu)指針都有一個內(nèi)核空間的文件描述符fd與之對應(yīng)。同樣有相應(yīng)的預(yù)定義的FILE指針:stdin-standard input,stdout-standard output,stderr-standard error。 庫函數(shù)調(diào)用通常用于應(yīng)用程序中對一般文件的訪問。 庫函數(shù)調(diào)用是系統(tǒng)無關(guān)的,因此可移植性好。 由于庫函數(shù)調(diào)用是基于C庫的,因此也就不可能用于內(nèi)核空間的驅(qū)動程序中對設(shè)備的操作

相關(guān)文章

最新評論