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

Linux C中庫(kù)函數(shù)與系統(tǒng)調(diào)用的區(qū)別詳細(xì)解析

 更新時(shí)間:2013年08月23日 10:05:00   作者:  
以下是對(duì)Linux下C中庫(kù)函數(shù)和系統(tǒng)調(diào)用的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下

從程序完成的功能來(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)用? 這很容易,編譯下面的代碼。

復(fù)制代碼 代碼如下:

#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!” 的信息

相關(guān)文章

最新評(píng)論