Linux操作系統關於C library的理解?

1.GNU的glibc指的是圖中C Library嗎? 這個C Library是Linux操作系統的API嗎?

2. Linux系統C語言編程都是通過調用C Library來實現的嗎?

3.如何查看C Library裡面都有哪些函數?

4.System Call Interface指的是Linux Kernel API嗎?和C Library的區別?


1. 不是。glibc 是一種 C 標準庫的實現(但 glibc 裡邊不僅僅有 C 標準庫的內容,還有 POSIX 的內容,以及一些其它的東西)。除此之外還有不少針對嵌入式設備開發的 C 庫,如 musl、uclibc 以及 Android 的 bionic。「Linux操作系統的API」是個很模糊的概念。Linux 的 C 庫是 POSIX 標準的一部分,不是內核 API 的一部分,不是 X Window、Wayland 或者其它任何桌面環境的標準的一部分。

2. 當然不是。不然你怎麼寫內核模塊?除此之外基本上正常的項目都會用 C 標準庫,因為它是 C 語言的標準運行時嘛。

3. 看 C 語言教材、POSIX 或者 glibc 文檔。

4. 是。內核 API 需要使用特別的方式(系統調用,x86_64 上是 syscall 指令,x86 上是 int $0x80 中斷)來調用。C 標準庫使用的是調用 C 語言函數的調用約定。


1、glibc就是GNU C Library. glibc是一種C函數庫,是程序運行時使用到的一些API集合。目前最主要的應用是配合Linux內核,成為GNU/Linux操作系統一個重要的組成部分。Linux man中位於section 3.

2、不是. Linux C可以用到glibc函數(用戶空間),也可以用到system call函數(內核空間, 特殊許可權). 如Linux諸多命令的實現,cp、pwd、who、stty等等,socket編程(參看Unix/Linux編程實踐教程、APUE) system call在Linux man中位於sectino 2.

3、Linux 中如何快速查看 C 庫函數的頭文件以及相應的函數信息? - 詒條狗的回答

4、應用代碼可以直接調用system call(無緩衝、開銷大), 也可以調用C Library(有緩衝),某些C Library函數調用system call實現. 如C Library的malloc函數,調用的就是system call的sbrk函數實現的. (APUE人郵第三版第17-18頁)可以做一個實現,#include & int main(void) { printf("hello"); return 0; } ,編譯gcc -Wall -o hello hello.c完成後,strace hello(Linux strace命令追蹤),可以看到hello程序用到的每一個system call,類似open、access,差不多最後你看到printf函數調用了system call的write函數寫輸出.


1.GNU的glibc指的是圖中C Library嗎?

glibc是GNU對於C標準庫的一個實現。

這個C Library是Linux操作系統的API嗎?

顯然不是。圖裡都明確地畫成兩坨了,你問個啥?

2. Linux系統C語言編程都是通過調用C Library來實現的嗎?

顯然不是。你若是不需要,就可以完全不用C標準庫的內容。

3.如何查看C Library裡面都有哪些函數?

依據C語言標準的規定。當然,具體在某個系統、某個編譯器里,人家可以不按規定來。

在Unix類的系統里,可以用man看第三頁。

4.System Call Interface指的是Linux Kernel API嗎?

對於Linux,是。

然而,顯然這個世界上有很多種操作系統,對於別的系統,顯然就不是了啊啊啊。

和C Library的區別?

圖裡畫的很明白。


前面幾位回答的已經挺全面了,再補充點參考資料吧。

glibc , C Library 與 Linux system API 的關係可以參考《unix環境高級編程》1.11節

關於system call,並不需要什麼特別的調用方式,直接調就好了,open,close,lseek什麼的全都是system call

C Library包含的函數,《unix環境高級編程》2.2.1節和2.2.2節列出了一些標準頭文件及其功能,根據所需功能去看頭文件不就好了。


推薦閱讀:

如何訪問linux內核,讀取所有進程的task_struct結構?/dev/mem?還是編寫驅動程序?
為什麼 Linux 不用微內核?
在做完內核裁剪後,等待編譯結果的過程是一種怎樣的體驗?
你為什麼學習 Linux 內核?
多個socket同時發送數據,網卡是輪流發送每個socket數據包嗎?每個包多大?

TAG:Linux開發 | Linux內核 | UNIX環境高級編程書籍 |