Linux C中庫函式和系統呼叫的區別

2021-06-25 07:32:27 字數 1571 閱讀 6401

從程式完成的功能來看,函式庫提供的函式通常是不需要作業系統的服務. 函式是在使用者空間內執行的,除非函式涉及到i/o操作等,一般是不會切到核心態的。

系統呼叫是要求作業系統為使用者提供程序,提供某種服務,通常是涉及系統的硬體資源和一些敏感的軟體資源等。

函式庫的函式,尤其與輸入輸出相關的函式,大多必須通過linux的系統呼叫來完成。因此我們可以將函式庫的函式當成應用程式設計人員與系統呼叫程式之間的乙個中間層,

通過這個中間層,我們可以用一致的介面來安全的呼叫系統呼叫。這樣程式設計師可以只要寫一次**就能夠在不同版本的linux系統間使用積壓種具體實現完全不同的系統呼叫。

至於如何實現對不同的系統呼叫的相容性問題,那是函式庫開發者所關心的問題。

從程式執行效率來看,系統呼叫的執行效率大多要比函式高,尤其是處理輸入輸出的函式。當處理的資料量比較小時,函式庫的函式執行效率可能比較好,

因為函式庫的作法是將要處理的資料先存入緩衝區內,等到緩衝區裝滿了,再將資料一次寫入或者讀出。這種方式處理小量資料時效率比較高,但是在進行系統呼叫時,

因為使用者程序從使用者模式進入系統核心模式,中間涉及了許多額外的任務的切換工作,這些操作稱為上下文切換,此類的額外工作會影響系統的執行效率。

但是當要處理的資料量比較大時,例如當輸入輸出的資料量超過檔案系統定義的盡寸時,利用系統呼叫可獲得較高的效率。

從程式的可移植性的角度來看,相對於系統呼叫,c語言的標準備函式庫(ansi c) 具備較高的可移植性,在不同的系統環境下,只要做很少的修改,

通常情況是不需要修改的。

庫函式是高層的,完全執行在使用者空間, 為程式設計師提供呼叫真正的在幕後完成實際事務的系統呼叫的更方便的介面。

系統呼叫在核心態執行並且由核心自己提供。標準c庫函式printf()可以被看做是乙個通用的輸出語句,

但它實際做的是將資料轉化為符合格式的字串並且呼叫系統呼叫write()輸出這些字串。

是否想看一看printf()究竟使用了哪些系統呼叫? 這很容易,編譯下面的**。

#include

int main(void)

使用命令

gcc -wall -o hello hello.c

編譯。用命令strace hello 跟蹤該可執行檔案。是否很驚訝? 每一行都和乙個系統呼叫相對應。strace是乙個非常有用的程式,

它可以告訴你程式使用了哪些系統呼叫和這些系統呼叫的引數,返回值。 這是乙個極有價值的檢視程式在幹什麼的工具。在輸出的末尾,

你應該看到這樣類似的一行write(1, "hello", 5hello)。這就是我們要找的。藏在面具printf() 的真實面目。

既然絕大多數人使用庫函式來對檔案i/o進行操作(像fopen, fputs, fclose)。 你可以檢視man說明的第二部分使用命令man 2 write 。

man說明的第二部分專門介紹系統呼叫(像kill()和read())。man說明的第三部分則專門介紹你可能更熟悉的庫函式(像cosh()和random())。

你甚至可以編寫**去覆蓋系統呼叫,正如我們不久要做的。駭客常這樣做來為系統安裝後門或木馬。 

但你可以用它來完成一些更有益的事,像讓核心在每次某人刪除檔案時輸出 「tee hee, that tickles!」 的資訊。

Linux C中庫函式和系統呼叫的區別

庫函式是高層的,完全執行在使用者空間,為程式設計師提供呼叫真正的在幕後完成實際事務的系統呼叫的更方便的介面。系統呼叫在核心態執行並且由核心自己提供。標準c庫函式printf 可以被看做是乙個通用的輸出語句,但它實際做的是將資料轉化為符合格式的字串並且呼叫系統呼叫 write 輸出這些字串。是否想看一...

linux C庫函式與系統呼叫的區別

linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 可以參考 linux程式設計 英文原版為 beginning linux programming 作者是neil matthew和richard stones 第三章 working...

linux C庫函式與系統呼叫的區別

linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 可以參考 linux程式設計 英文原版為 beginning linux programming 作者是neil matthew和richard stones 第三章 working...