自己想了解下關於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 的特色。