系統呼叫和庫函式呼叫的區別
系統呼叫概念:所有作業系統都提供了多鐘服務的入口點,通過這些入口點,由程式向核心請求服務,這些入口點稱作系統呼叫。
1.從程式完成的功能看:
①系統呼叫:要求作業系統為使用者提供程序,提供某種服務,通常是涉及系統的硬體資源和一些敏感的軟體資源等。
②函式庫提供的函式通常是不需要作業系統的服務,函式是在使用者空間內執行的,除非函式涉及到i/o操作等,一般是不會切到核心態的。
函式庫的函式,尤其與輸入輸出相關的函式,大多必須通過linux的系統呼叫來完成。因此我們可以將函式庫的函式當成應用程式設計人員與系統呼叫程式之間的乙個中間層,通過這個中間層,我們可以用一致的介面來安全的呼叫系統呼叫。這樣程式設計師可以只要寫一次**就能夠在不同版本的linux系統間使用積壓種具體實現完全不同的系統呼叫。至於如何實現對不同的系統呼叫的相容性問題,那是函式庫開發者所關心的問題。
2.從程式執行效率來看,系統呼叫的執行效率大多要比函式高,尤其是處理輸入輸出的函式。當處理的資料量比較小時,函式庫的函式執行效率可能比較好,因為函式庫的作法是將要處理的資料先存入緩衝區內,等到緩衝區裝滿了,再將資料一次寫入或者讀出。這種方式處理小量資料時效率比較高,但是在進行系統呼叫時,因為使用者程序從使用者模式進入系統核心模式,中間涉及了許多額外的任務的切換工作,這些操作稱為上下文切換,此類的額外工作會影響系統的執行效率。但是當要處理的資料量比較大時,例如當輸入輸出的資料量超過檔案系統定義的盡寸時,利用系統呼叫可獲得較高的效率。
3.從程式的可移植性的角度來看,相對於系統呼叫,c語言的標準備函式庫(ansi c) 具備較高的可移植性,在不同的系統環境下,只要做很少的修改,通常情況是不需要修改的。
4.※ 函式庫呼叫 vs 系統呼叫
函式庫呼叫
系統呼叫
在所有的ansi c編譯器版本中,c庫函式是相同的
各個作業系統的系統呼叫是不同的
它呼叫函式庫中的一段程式(或函式)
它呼叫系統核心的服務
與使用者程式相聯絡
是作業系統的乙個入口點
在使用者位址空間執行
在核心位址空間執行
它的執行時間屬於「使用者時間」
它的執行時間屬於「系統」時間
屬於過程呼叫,呼叫開銷較小
需要在使用者空間和核心上下文環境間切換,開銷較大
在c函式庫libc中有大約300個函式
在unix中大約有90個系統呼叫
典型的c函式庫呼叫:system fprintf malloc
典型的系統呼叫:chdir fork write brk;
5.例項
庫函式是高層的,完全執行在使用者空間, 為程式設計師提供呼叫真正的在幕後完成實際事務的系統呼叫的更方便的介面。系統呼叫在核心態執行並且由核心自己提供。標準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!」 的資訊。
庫函式呼叫和系統呼叫的區別
庫函式是語言本身的一部分,而系統函式是核心提供給應用程式的介面,屬於系統的一部分。函式庫呼叫是語言或應用程式的一部分,而系統呼叫是作業系統的一部分。函式庫呼叫 系統呼叫 在所有的ansi c編譯器版本中,c庫函式是相同的 各個作業系統的系統呼叫是不同的 它呼叫函式庫中的一段程式 或函式 它呼叫系統核...
linux系統呼叫和庫函式呼叫的區別
linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 可以參考 linux程式設計 英文原版為 beginning linux programming 作者是neil matthew和richard stones 第三章 working...
linux 系統呼叫和庫函式呼叫的區別
linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,...