手冊中有多個章節。其中兩個是:「C系統調用」和「C庫例程」有什麼區別?
2 Unix and C system calls 3 C Library routines for C programs
比如有getmntinfo(3)
和getfsstat(2)
,看起來都像他們做同樣的事情。什麼時候應該使用哪個和哪個區別?
手冊中有多個章節。其中兩個是:「C系統調用」和「C庫例程」有什麼區別?
2 Unix and C system calls 3 C Library routines for C programs
比如有getmntinfo(3)
和getfsstat(2)
,看起來都像他們做同樣的事情。什麼時候應該使用哪個和哪個區別?
系統調用是用戶級代碼和內核之間的接口。 C庫例程與其他任何庫函數一樣,它們只是碰巧提供(非常普遍)。很多標準庫例程都是圍繞系統調用的包裝器(很薄或以其他方式),這往往會使線條模糊不清。
至於哪一個使用,作爲一般規則,使用最適合您的需求。
本手冊第2部分描述的調用都是圍繞對系統服務進行實際調用的相對較簡單的包裝,這些系統服務陷入內核。本手冊第3節中描述的C標準庫例程是客戶端庫函數,它們可能會或可能不會實際使用系統調用。
This posting描述了系統調用並捕獲到內核(稍有不同的上下文),並解釋了帶有一些引用的系統調用背後的底層機制。
通用函數庫建立在系統調用接口之上,但應用程序可以自由使用這兩個函數。
系統調用就像有權使用內核資源的認證密鑰。
上面的影像是由高級Linux編程,並有助於瞭解用戶的應用程序如何與內核進行交互。
作爲一般規則,您應該始終使用C庫版本。他們通常擁有處理諸如信號重啓等深奧內容的包裝(如果你有要求的話)。如果您已經與圖書館建立了聯繫,情況尤其如此。所有規則都有理由被打破。原因使用直撥電話,
libc
不可知論的;也許與安裝程序。無論使用哪種庫,此類代碼都可以在Android(bionic),uClibc和更傳統的glibc/eglibc系統上運行。此外,動態加載與包裝,使運行時glibc /仿生層允許雙Android/Linux二進制。libc
偶爾可以做。initramfs
或init
;創建更小的圖像或啓動更快。initramfs
。libc
例程。libc
中的已知錯誤。libc
。對不起,大多數例子都是Linux專用的,但其理由應該適用於其他Unix變體。當新功能引入內核時,最後一項很常見。例如,當第一次引入kqueue
或epoll
時,沒有libc
來支持它們。如果系統具有較舊的庫,但是較新的內核並且您希望使用此功能,也可能會發生這種情況。
如果你的程序沒有使用libc
,那麼很可能是系統中的某些東西。通過爲自己的變體編碼,您可以通過提供兩條路徑來實現相同的最終目標,從而取消緩存。此外,Unix 將在進程之間共享代碼頁。通常沒有理由不使用libc
版本。
其他答案已經在libc
和系統調用之間的區別做了一個很好的工作。
真棒圖片。非常清楚 – henryyao 2013-04-11 01:33:05