天天看點

glibc庫詳解及與POSIX,system V這些庫之間關系的說明

自己想了解下關于system v,在網上看到一篇詳細的說明,與大家分享一下,原文位址http://hi.baidu.com/tekuba/item/570887775696542e5c178918

     以前對glibc,POSIX等的關系一直很迷惑。這是今天在網上找到的說明glibc,POSIX,system V關系的一篇不錯的文章,雖然有些地方不通順(大概是直接用機器翻譯過來的),但大概意思能明白了。通過下面的說明,我們就可以明白linux應用層的層次構造。關鍵是glibc,他是linux最底層的api,他包括了很多的規範,比如system V,ISO C,和POSIX 。其他的函數庫,都是在調用glibc的基礎上進行各種擴充,如X庫等。當然我的了解也可能有誤,歡迎探讨指正。

下面是部分摘錄:

glibc

  glibc 是gnu釋出的libc庫,也即c運作庫。

  glibc是linux系統中最底層的api(應用程式開發接口),

  幾乎其它任何的運作庫都會依賴于glibc。

  glibc除了封裝linux作業系統所提供的系統服務外,

  它本身也提供了許多其它一些必要功能服務的實作,主要的如下:

  (1)string,字元串處理

  (2)signal,信号處理

  (3)dlfcn,管理共享庫的動态加載

  (4)direct,檔案目錄操作

  (5)elf,共享庫的動态加載器,也即interpreter

  (6)iconv,不同字元集的編碼轉換

  (7)inet,socket接口的實作

  (8)intl,國際化,也即gettext的實作

  (9)io

  (10)linuxthreads

  (11)locale,本地化

  (12)login,虛拟終端裝置的管理,及系統的安全通路

  (13)malloc,動态記憶體的配置設定與管理

  (14)nis

  (15)stdlib,其它基本功能

  GLIBC 的内容

   由于glibc 囊括了幾乎所有的UNIX 通行的标準(比如system V和POSIX标準,glibc都是包括的),可以想見其内容包羅萬有。而就像其他的UNIX 系統一樣,其内含的檔案群分散于系統的樹狀目錄結構中,像一個支架一般撐起整個作業系統。以glibc-2.2 為例,這些檔案群主要包括:

  1.分享函式庫群: (.so為共享函數庫)

   這是 glibc 的主體,分布 /lib 與 /usr/lib 中,包括 libc 标準 C 函式庫、libm 數學函式庫、libcrypt加密與編碼函式庫、libdb 資料庫函式庫、libpthread行程多執行緒函式庫、libnss 網路服務函式庫等等。這些都是可分享函式庫,檔名都以 .so 做結尾。其中,/lib/ld*.so 是程式與函式庫連結的工具。有的用于程式編譯時将程式與函式庫内的函式物件連結,在隻支援靜态連結的系統中,此連結方式就是直接将所需的物件自函式庫中抽出c程式的可執行檔相連,而在支援可分享函式庫的系統中,在程式編譯時期的連結隻是在執行檔中紀錄了 那些函式物件是存在那個函式庫檔案中,等該程式開始執行時,則由另一個負責動态連結的 ld*.so将所需的函式庫連結好執行

  一般而言,負責程式編譯時期的連結器檔名為 ld.so,而負責程式執行時的動态連結器檔名為 ld- .so 或 ld-linux.so (在 GNU/Linux 系統中)。

  函式庫标頭檔與程式開發元件:

  這些标頭檔檔名都以 .h 為結尾,全部在/usr/include/ 底下,其内容為函式庫中各函式的宣告、巨集定義、資料物件的型别等等,這些都是程式開發者不可或缺的部分。

  除此之外,在 /usr/lib/ 中還有若幹 .o 與 .a 的檔案,這些是程式編譯過程中要連結為可執行檔時所需的元件,有些則為上述可分享函式庫的靜态連接配接版本,而後者可以在某些特殊場合下需要靜态連結程式時使用。

  函式庫說明檔案:

   在一般的 UNIX 系統下,這些說明檔案是放在/usr/man 或 /usr/share/man 底下,統稱為 man pages,其底下還分若幹章節,其中第二章 (man2) 講的是系統呼叫,而第三章 (man3) 講的就是 libc 标準函式庫,這些都是系統開發者重要的參考資料。

  而在 GNU 的系統中,除了 man pages 之外,還有一套稱為 info 的檔案資料系統,而且裡頭的說明往往比 man pages 還要詳盡,這在 glibc 中也不例外。Glibc 的info 檔案位于/usr/share/info/libc.info* ,本文中有許多素材就是取自這些檔案的内容。

  字集轉換模組與區域化資料庫:

   這些是與程式國際化與本土化相關的部分,主要可分成四大塊: /usr/lib/gconv/ 内含大量的字集轉換模組,大部分是各種字集及編碼方式與系統的基底字集之間的轉換。第二塊是/usr/lib/locale,内含以系統基底字集寫成的區域化資料庫 (locale),像是 LC_CTYPE、LC_TIME等等。第三塊是/usr/share/locale/,内含可跨平台使用的區域化資料,主要是各應用程式的?息翻譯部分。而最後一塊是 /usr/share/i18n/,其内容是各區域化資料庫的原始碼,以及系統支援的内碼對應表等等。

  時區資料庫:

  主要分别在 /usr/share/zoneinfo 底下,内含世界各地時區與格林威治時間的轉換資料。

  其他工具程式與設定檔:

   工具程式分言 /usr/bin 與 /sbin 底下,包括一些轉碼與區域化資料庫相關的程式如iconv, locale,localedef 等,以及用?盹@示應用程式與可分享函式庫相依關系的 ldd, 還有可分享函式庫搜尋路?焦芾沓淌 ldconfig 等。而其相關的設定檔則位于 /etc 底下。

  disaos

  03-11-03, 10:42

  GLIBC 的規格

   在 GNU/Linux 系統中,其C函式庫的發展史點出了 GNU/Linux 演進的幾個重要裡程碑,由此可以突顯出 C 函式庫在系統中的地位與重要性。早期的 GNU/Linux 系統?K不支援可分享函式庫,是以所有的應用程式都是以靜态連結的方式存于系統中。直到 1995-1996 年 libc5 問世以後,系統才開始支援 ELF 可分享函式庫,同時該版的 C 函式庫也作了其他 UNIX 上大部分的功能與函式群,可謂 GNU/Linux 發展上的一大進步。

  然而 libc5 在程式國際化 (I18N) 與本土化 (L10N) 方面的支援很差,故那個時候若要開發所謂中文化的程式,就非得自行作一套标準不可。直到一兩年後, GNU/Linux 換用了 GNU 所開發的 glibc-2.0 做為其 C 函式庫後,其國際化與本土化的支援才開始起步,後?須v經 glibc-2.1,到了現在的 2.2 版,整個多國國文的開發環境才大至成熟。

  用 glibc 做為系統的 C 函式庫,是 GNU/Linux 演進的一個重要裡程碑。在 GNU 的計畫中,開發 glibc 原本是要給他們尚未問世的核心 GNU/Hurd 用的,由于當時幾乎 99% 的 GNU 系統工具已開發完成,就獨缺核心Hurd(核心kernel),而恰巧 Linux 核心在Torvalds 的帶領下已逐?u成熟穩定,而且可以順利執行所有的 GNU 系統工具。故 GNU 團隊便順應 Linux 核心的特性,改寫了他們的 glibc,使其可以适用于 Hurd 核心與 Linux 核心。如此,在這兩個平台上就有了一緻的程式開發環境,使得所有的 GNU 程式可以在這兩個平台之間順利移植。

  比起過去的libc5,glibc 系列(一般又稱之為libc6) 除了有完整的國際化與本土化支援外,同時還符合許多标準與規格,使得在glibc 下開發的程式可以很容易移植到其他UNIX 平台去。這些标準包括:

(以下都是glibc支援的規範)

  ISO C:

   ISO C 是International Standardfor the C programming language 的縮寫,此标準明定了C 語言的文法,标準C 函式庫應具備那些标頭檔、巨集定義、函式與物件等等,幾乎在任何平台上的 C 語言(包括非UNIX 平台) 都支援此标準。

  POSIX:

  POSIX 是Portable OperatingSystem Interface for Computer Environments 的縮寫,它是ISO C的延伸,明定了一個可移植的作業系統所應具備種種條件,其範圍不隻有系統函式庫而已,還同時包括一些标準的工具程式、系統核心應有的特色與?作、以及在 C 函式庫中某些與作業系統相關的低階控制支援(如系統呼叫視窗) 等等。由于glibc 是完全按照POSIX 的标準制作的,同時搭配了符合 POSIX 标準的Linux 核心,故在此環境下開發的程式可以做到完全符合POSIX 的規格。

  Berkeley Unix:

   Berkeley Unix 泛稱柏克萊大學所開發的 UNIX 系列作業系統,包括 4.2 BSD、4.3 BSD、4.4BSD 以及早期的 SunOS。這些系統的 C 函式庫中有許多傑出的設計,但卻沒有在上述兩個标準中,包括 select() 函式、sockets等等,這些在 glibc 中都有支援。

  SVID:

  SVID 是System V InterfaceDescription 的縮寫,它是一份描述AT&T UNIX System V 系統規格的檔案,它是POSIX 标準的延伸。Glibc ?作了大部分的SVID 規格要求,其中較重要的包括了行程之間的通?标準以及分享式記憶體(shared memory),至于其他的部分則較不常使用。?作SVID 主要的目的是希望可以做到與UNIX System V 的相容與程式的可移植性。

  XPG:

   XPG 是 X/Open Portability Guide 的縮寫,是由 X/Open Company, Ltd. 所發表,同時X/Open 還擁有 UNIX 商标的版權。而這份規格不但是 POSIX 标準的擴充,同時也明定了一個 UNIX作業系統所應符合的要求。其中包括了 iconv() 字集轉換介面,以及部分 BSD 與 SVID 的特色。

上一篇: iscsi

繼續閱讀