2009-02-21 143 views

回答

30

系統調用是操作系統函數,就像在UNIX上一樣,malloc()函數建立在sbrk()系統調用之上(用於調整進程內存空間大小)。

庫只是應用程序代碼,它不是操作系統的一部分,並且通常可用於多個操作系統。它們與您自己的程序中的函數調用基本相同。

該行可能有點模糊,但只是將系統調用視爲內核級功能。

12

系統調用是用戶級代碼和內核之間的接口。 C庫例程與其他任何庫函數一樣,它們只是碰巧提供(非常普遍)。很多標準庫例程都是圍繞系統調用的包裝器(很薄或以其他方式),這往往會使線條模糊不清。

至於哪一個使用,作爲一般規則,使用最適合您的需求。

6

本手冊第2部分描述的調用都是圍繞對系統服務進行實際調用的相對較簡單的包裝,這些系統服務陷入內核。本手冊第3節中描述的C標準庫例程是客戶端庫函數,它們可能會或可能不會實際使用系統調用。

This posting描述了系統調用並捕獲到內核(稍有不同的上下文),並解釋了帶有一些引用的系統調用背後的底層機制。

11

通用函數庫建立在系統調用接口之上,但應用程序可以自由使用這兩個函數。

系統調用就像有權使用內核資源的認證密鑰。

enter image description here

上面的影像是由高級Linux編程,並有助於瞭解用戶的應用程序如何與內核進行交互。

+0

真棒圖片。非常清楚 – henryyao 2013-04-11 01:33:05

3

作爲一般規則,您應該始終使用C庫版本。他們通常擁有處理諸如信號重啓等深奧內容的包裝(如果你有要求的話)。如果您已經與圖書館建立了聯繫,情況尤其如此。所有規則都有理由被打破。原因使用直撥電話,

  1. 你想成爲libc不可知論的;也許與安裝程序。無論使用哪種庫,此類代碼都可以在Android(bionic),uClibc和更傳統的glibc/eglibc系統上運行。此外,動態加載與包裝,使運行時glibc /仿生層允許雙Android/Linux二進制。
  2. 您需要極高的性能。雖然這可能很少見,而且很可能被誤導了。可能重新考慮問題會帶來更好的性能優勢,並且不是調用系統往往是性能贏,其中libc偶爾可以做。
  3. 您正在編寫一些不帶庫的代碼initramfsinit;創建更小的圖像或啓動更快。
  4. 您正在測試新的內核/平臺,並且不希望使用完整的文件系統使生活複雜化;非常類似於initramfs
  5. 您希望在程序啓動時非常快速地執行某些操作,但最終需要使用libc例程。
  6. 爲了避免libc中的已知錯誤。
  7. 該功能不可用,通過libc

對不起,大多數例子都是Linux專用的,但其理由應該適用於其他Unix變體。當新功能引入內核時,最後一項很常見。例如,當第一次引入kqueueepoll時,沒有libc來支持它們。如果系統具有較舊的庫,但是較新的內核並且您希望使用此功能,也可能會發生這種情況。

如果你的程序沒有使用libc,那麼很可能是系統中的某些東西。通過爲自己的變體編碼,您可以通過提供兩條路徑來實現相同的最終目標,從而取消緩存。此外,Unix 將在進程之間共享代碼頁。通常沒有理由不使用libc版本。

其他答案已經在libc和系統調用之間的區別做了一個很好的工作。