Linux C中庫函數和系統調用的區別

來源:互聯網
上載者:User

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

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

#include <stdio.h>
int main(void)
{
  printf("hello");
  return 0;
}

  使用命令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!” 的資訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.