C库函数与Linux系统函数之间的关系
? ? ? ? 由上小節(jié)知道,C庫(kù)函數(shù)是借助FILE類型的結(jié)構(gòu)體來(lái)對(duì)文件進(jìn)行操作的,其本身只是在用戶空間(I/O緩沖區(qū))進(jìn)行讀寫(xiě)操作,而數(shù)據(jù)在內(nèi)核與用戶空間之間的傳遞、以及將內(nèi)核與I/O設(shè)備之間的數(shù)據(jù)傳遞都是該C庫(kù)函數(shù)進(jìn)行一系列的系統(tǒng)調(diào)用來(lái)完成的。每一個(gè)C庫(kù)函數(shù)(接口函數(shù),API)對(duì)應(yīng)的是一個(gè)或多個(gè)系統(tǒng)調(diào)用。
? ? ? ? 下圖以printf函數(shù)為例。printf是標(biāo)準(zhǔn)輸出流的輸出函數(shù)(其文件描述符為1,STDOUT_FILENO),用來(lái)向屏幕這樣的標(biāo)準(zhǔn)輸出設(shè)備輸出,而fprintf則是向文件輸出,將輸出的內(nèi)容輸出到硬盤(pán)上的文件或是相當(dāng)于文件的設(shè)備上。printf是行緩沖的輸出,fprintf是全緩沖的輸出。
? ? ? ? 由該圖可以看出,C庫(kù)函數(shù)printf標(biāo)準(zhǔn)輸出的文件描述符為fd,文件讀寫(xiě)指針為FP_POS,I/O緩沖區(qū)為BUFFER,其中存儲(chǔ)了要輸出的內(nèi)容(hello),這些都保存在FILE結(jié)構(gòu)體中。為了實(shí)現(xiàn)將緩沖區(qū)的數(shù)據(jù)送入內(nèi)核緩沖中,printf函數(shù)需要調(diào)用write函數(shù),其有三個(gè)參數(shù):文件描述符、字符串和字符串長(zhǎng)度,從而把文件描述符和輸出的內(nèi)容傳遞到內(nèi)核。強(qiáng)調(diào)一點(diǎn):write函數(shù)是應(yīng)用層的函數(shù),處于用戶空間,對(duì)用戶空間進(jìn)行操作。接著,調(diào)用函數(shù)sys_write( ),該函數(shù)完成一個(gè)系統(tǒng)調(diào)用,位于內(nèi)核空間,對(duì)內(nèi)核操作,調(diào)用相應(yīng)的設(shè)備驅(qū)動(dòng)程序,屬于內(nèi)核層。最后,設(shè)備驅(qū)動(dòng)程序運(yùn)行,驅(qū)動(dòng)設(shè)備完成輸出數(shù)據(jù)到顯示器的操作,屬于硬件層。這也是由系統(tǒng)調(diào)用來(lái)完成的。
總結(jié)
以上是生活随笔為你收集整理的C库函数与Linux系统函数之间的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: makefile的两个变量(自动变量和普
- 下一篇: 成都欢乐谷哪些人免费