庫函式是高層的,完全執行在使用者空間, 為程式設計師提供呼叫真正的在幕後完成實際事務的系統呼叫的更方便的介面。系統呼叫在核心態執行並且由核心自己提供。標準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中庫函式和系統呼叫的區別
從程式完成的功能來看,函式庫提供的函式通常是不需要作業系統的服務.函式是在使用者空間內執行的,除非函式涉及到i o操作等,一般是不會切到核心態的。系統呼叫是要求作業系統為使用者提供程序,提供某種服務,通常是涉及系統的硬體資源和一些敏感的軟體資源等。函式庫的函式,尤其與輸入輸出相關的函式,大多必須通過...
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...