Linux C中庫(kù)函數(shù)與系統(tǒng)調(diào)用的區(qū)別詳細(xì)解析
從程序完成的功能來(lái)看,函數(shù)庫(kù)提供的函數(shù)通常是不需要操作系統(tǒng)的服務(wù),函數(shù)是在用戶空間內(nèi)執(zhí)行的,除非函數(shù)涉及到I/O操作等,一般是不會(huì)切到核心態(tài)的。系統(tǒng)調(diào)用是要求操作系統(tǒng)為用戶提供進(jìn)程,提供某種服務(wù),通常是涉及系統(tǒng)的硬件資源和一些敏感的軟件資源等。
函數(shù)庫(kù)的函數(shù),尤其與輸入輸出相關(guān)的函數(shù),大多必須通過(guò)Linux的系統(tǒng)調(diào)用來(lái)完成。因此我們可以將函數(shù)庫(kù)的函數(shù)當(dāng)成應(yīng)用程序設(shè)計(jì)人員與系統(tǒng)調(diào)用程序之間的一個(gè)中間層,通過(guò)這個(gè)中間層,我們可以用一致的接口來(lái)安全的調(diào)用系統(tǒng)調(diào)用。這樣程序員可以只要寫(xiě)一次代碼就能夠在不同版本的linux系統(tǒng)間使用積壓種具體實(shí)現(xiàn)完全不同的系統(tǒng)調(diào)用。至于如何實(shí)現(xiàn)對(duì)不同的系統(tǒng)調(diào)用的兼容性問(wèn)題,那是函數(shù)庫(kù)開(kāi)發(fā)者所關(guān)心的問(wèn)題。
從程序執(zhí)行效率來(lái)看,系統(tǒng)調(diào)用的執(zhí)行效率大多要比函數(shù)高,尤其是處理輸入輸出的函數(shù)。當(dāng)處理的數(shù)據(jù)量比較小時(shí),函數(shù)庫(kù)的函數(shù)執(zhí)行效率可能比較好,因?yàn)楹瘮?shù)庫(kù)的作法是將要處理的數(shù)據(jù)先存入緩沖區(qū)內(nèi),等到緩沖區(qū)裝滿了,再將數(shù)據(jù)一次寫(xiě)入或者讀出。這種方式處理小量數(shù)據(jù)時(shí)效率比較高,但是在進(jìn)行系統(tǒng)調(diào)用時(shí),因?yàn)橛脩暨M(jìn)程從用戶模式進(jìn)入系統(tǒng)核心模式,中間涉及了許多額外的任務(wù)的切換工作,這些操作稱為上下文切換,此類的額外工作會(huì)影響系統(tǒng)的執(zhí)行效率。但是當(dāng)要處理的數(shù)據(jù)量比較大時(shí),例如當(dāng)輸入輸出的數(shù)據(jù)量超過(guò)文件系統(tǒng)定義的盡寸時(shí),利用系統(tǒng)調(diào)用可獲得較高的效率。
從程序的可移植性的角度來(lái)看,相對(duì)于系統(tǒng)調(diào)用,C語(yǔ)言的標(biāo)準(zhǔn)備函數(shù)庫(kù)(ANSI C) 具備較高的可移植性,在不同的系統(tǒng)環(huán)境下,只要做很少的修改,通常情況是不需要修改的。
Linux C中庫(kù)函數(shù)和系統(tǒng)調(diào)用的區(qū)別
庫(kù)函數(shù)是高層的,完全運(yùn)行在用戶空間,為程序員提供調(diào)用真正的在幕后完成實(shí)際事務(wù)的系統(tǒng)調(diào)用的更方便的接口。系統(tǒng)調(diào)用在內(nèi)核態(tài)運(yùn)行并且由內(nèi)核自己提供。標(biāo)準(zhǔn)C庫(kù)函數(shù)printf()可以被看做是一個(gè)通用的輸出語(yǔ)句,但它實(shí)際做的是將數(shù)據(jù)轉(zhuǎn)化為符合格式的字符串并且調(diào)用系統(tǒng)調(diào)用 write()輸出這些字符串。
是否想看一看printf()究竟使用了哪些系統(tǒng)調(diào)用? 這很容易,編譯下面的代碼。
#include <stdio.h>
int main(void)
{ printf("hello"); return 0; }
使用命令gcc -Wall -o hello hello.c編譯。用命令 strace hello 跟蹤該可執(zhí)行文件。是否很驚訝? 每一行都和一個(gè)系統(tǒng)調(diào)用相對(duì)應(yīng)。 strace是一個(gè)非常有用的程序,它可以告訴你程序使用了哪些系統(tǒng)調(diào)用和這些系統(tǒng)調(diào)用的參數(shù),返回值。 這是一個(gè)極有價(jià)值的查看程序在干什么的工具。在輸出的末尾,你應(yīng)該看到這樣類似的一行 write(1, "hello", 5hello)。這就是我們要找的。藏在面具printf() 的真實(shí)面目。既然絕大多數(shù)人使用庫(kù)函數(shù)來(lái)對(duì)文件I/O進(jìn)行操作(像 fopen, fputs, fclose)。 你可以查看man說(shuō)明的第二部分使用命令man 2 write 。man說(shuō)明的第二部分專門(mén)介紹系統(tǒng)調(diào)用(像kill()和read())。 man說(shuō)明的第三部分則專門(mén)介紹你可能更熟悉的庫(kù)函數(shù)(像cosh()和random())。
你甚至可以編寫(xiě)代碼去覆蓋系統(tǒng)調(diào)用,正如我們不久要做的。駭客常這樣做來(lái)為系統(tǒng)安裝后門(mén)或木馬。 但你可以用它來(lái)完成一些更有益的事,像讓內(nèi)核在每次某人刪除文件時(shí)輸出 “ Tee hee, that tickles!” 的信息
- Linux中獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用以及參數(shù)(故障排查案例)
- linux 系統(tǒng)調(diào)用與標(biāo)準(zhǔn)庫(kù)調(diào)用的區(qū)別詳細(xì)解析
- 三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用
- 基于Linux系統(tǒng)調(diào)用--getrlimit()與setrlimit()函數(shù)的方法
- 詳解linux系統(tǒng)調(diào)用原理
- Linux內(nèi)核設(shè)備驅(qū)動(dòng)之系統(tǒng)調(diào)用筆記整理
- Linux被中斷的系統(tǒng)如何調(diào)用詳解
相關(guān)文章
Linux操作系統(tǒng)口令文件安全問(wèn)題詳細(xì)解析
2008-01-01個(gè)人學(xué)習(xí)Linux知識(shí)總結(jié)
個(gè)人學(xué)習(xí)linux經(jīng)常用到的小知識(shí),方便大家以后查閱2008-04-04linux下使用docker-thunder-xware進(jìn)行離線下載(推薦)
這篇文章主要介紹了linux下使用docker-thunder-xware進(jìn)行離線下載的方法,感興趣的朋友一起看看吧2017-08-08Linux系統(tǒng)下如何查看及修改文件讀寫(xiě)權(quán)限
linux下查看文件權(quán)限的命令2008-05-05