本附錄列出 Linux 的常見發行版(如 RedHat Linux)中包含的函數庫。除特別指出外,這些函數庫的使用和發行適用 GPL 條款或 LGPL 條款。 需要注意的是,Linux 上的函數庫正在以非常快的速度增加和更新,這裡列出的函數庫只是其中的一小部分。如果讀者要在 Linux 上進行開發,最好先了解一些是否有一些可供直接利用的函數庫,以避免重復開發。有關 Linux 上的應用和函數庫開發,可訪問如下站點: http://www.linux.org http://www.linuxstart.com http://www.linuxnow.com http://www.linuxresource.com http://www.ee.mu.oz.au/linux/programming/(The Linux Programmer’s BouncePoint) C.1 CrackLib CrackLib 為用戶提供了一個 C 語言函數接口,利用這一函數,可避免用戶選擇容易破解的密碼。該函數庫可在類似 passwd 的程序中使用。 C.2 GLib GLib 作為 GTK+ 的一個組件,提供了操作通用數據結構,如鏈表、樹、哈希表、內存分配等等在內的 C 函數庫。 C.3 glibc 眾所周知,C 語言並沒有為常見的操作,例如輸入/輸出、內存管理,字符串操作等提供內置的支持。相反,這些功能一般由標准的“函數庫”來提供。 GNU 的 C 函數庫,即 glibc,定義了 ISO C 標准指定的所有的庫函數,以及由 POSIX 或其他 UNIX 操作系統變種指定的附加特色,還包括有與 GNU 系統相關的擴展。 glibc 基於如下標准: ISO C:C 編程語言的國際標准。GNU C 函數庫與美國國家標准局(ANSI)公布的 C 標准兼容。這一標准後來被國際標准化組織所接收(ISO/IEC 9899:1990)。 POSIX:操作系統的 ISO/IEC 9945(即 IEEE 1003)標准。GNU C 函數庫實現了 ISO/IEC 9945-1:1996 (POSIX 系統應用程序編程接口,即 POSIX.1)指定的所有函數。該標准是對 ISO C 的擴展,包括文件系統接口原語、設備相關的終端控制函數以及進程控制函數。同時,GUN C 函數庫還支持部分由 ISO/IEC 9945-2:1993(POSIX Shell 和 工具標准,即 POSIX.2)指定的函數,其中包括用於處理正則表達式和模式匹配的函數。 Berkeley Unix:BSD 和 SunOS。GNU C 函數庫定義了某些 UNIX 版本中尚未標准化的函數,尤其是 4.2 BSD, 4.3 BSD, 4.4 BSD Unix 系統(即“Berkeley Unix”)以及“SunOS”(大眾化的 4.2 BSD 變種,其中包含有某些Unix System V 的功能)。BSD 函數包括符號鏈接、select 函數、BSD 信號處理函數以及套接字等等。 SVID:System V 的接口描述。System V 接口描述(SVID)是描述 AT&T Unix System V 操作系統的文檔,它是對 POSIX 標准的擴展超集。GNU C 函數庫定義了大多數由 SVID 指定而未被 ISO C 和 POSIX 標准指定的函數。來自 System V 的支持函數包括進程間通信和共享內存、hsearch 和 drand48 函數族、fmtmsg 以及一些數學函數。 XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.出版),是比 POSIX 更為一般的標准。X/Open 擁有 Unix 的版權,而 XPG 則指定成為 Unix 操作系統必須滿足的需求。GNU C 函數庫遵循 X/Open 可移植性指南(Issue 4.2)以及所有的 XSI(X/Open 系統接口)兼容系統的擴展,同時也遵循所有的 X/Open Unix 擴展。 C.4 Imlib Imlib 是一個一般性的圖象裝載和渲染庫。利用 Imlib,可簡化在 X-Window 系統中裝載圖象並獲得可繪制對象的工作。它提供了圖象渲染的快速操作函數,同時也為常見的圖象操作提供簡單的操作例程。 Imlib 的特色有: 在完整編譯的情況下,Imlib 可在無其他應用程序的幫助下,裝載 PPM、PGM、TIFF、PNG、XPM、JPEG 和 EIM 格式的圖象,並保留它們的透明特征。對於一些 Imlib 並不支持的圖象格式,它可依賴一組系統工具將這些圖象格式轉換為 Imlib 可理解的格式,然後進行處理,這樣,Imlib 能夠處理其他工具所能支持的任意格式。當前,Imlib 支持 Imagemagick 和 PBMPLUS 工具。利用外來工具時,裝載過程要慢一些。 Imlib 擁有圖象緩存功能。程序員可以編寫一些直接性的代碼,而不需要過多考慮性能問題。圖象被裝入之後,會緩存起來。如果圖象仍然在緩存中,就沒有必要重新裝入了,而只需從緩存中引用該圖象。於是,質樸的直接性代碼能夠保持較快的執行速度。 Imlib 可以對圖象進行任意倍數的縮放(限制在 32767 x 32767 象素)。這意味著僅通過一個函數調用,就可以將小的圖標放大,或者將大的圖象縮減為指甲大小的圖象。 Imlib 可通過灰度、亮度、對比度或任意的曲線映射關系提高圖象的可視度,或修飾其外觀。它允許進行灰度校正、白點校正或其他高級特色,而不需要其他硬件支持。 Imlib 可完成基本的圖象修飾(翻轉、旋轉等)。 Imlib 經過嚴格的優化,因此可以最高的速度獲得最好的結果。根據 X Server 和硬件的能力,可選擇不同的選項提高其渲染處理的速度。 Imlbi 可處理許多顯示深度。能夠在單色、2、3、4、5、6、7、8 位的偽色彩以及靜態顏色的系統上工作。它也可以在 15 位、16 位(555 和 565)、以及 24 位的色彩系統上工作。 在對圖象以不同的大小進行渲染時,Imlib 具有高級的 pixmap 緩存,可以重復使用,進而提供渲染速度。 Imlib 分別具有 Xlib 和 GDK 的版本,也可以同時安裝。這兩個版本共享同一個配置文件。 C.5 libgHTTP HTTP 是針對 WWW 底層傳輸機制的協議。該協議具有良好的文檔並被廣泛實現。而該協議的使用通常和 Web 聯系在一起,但該協議的使用卻可以擴展到任何一個適合的地方。libgHTTP 就是一個完全和 HTTP 1.1 (RFC 2068 的第五次修改草案中定義)兼容的函數庫。libgHTTP 的設計非常簡單而且易於使用。 C.6 LibGTop LibGTop 是一個能夠獲取進程信息以及系統運行信息的函數庫,這些信息包括: 系統的一般信息 cpu - CPU 的使用信息 mem - 內存使用信息 swap - 交換使用信息(包括分頁活動) loadavg - 負載的平均水平(包括可運行進程數目、進程總數目和上一次運行的進程標識號等) uptime - 啟動後的時間以及空閒時間,可從 CPU 的使用信息中計算得到。 SYS V IPC 限制 shm_limits - 共享內存的限制信息 msg_limits - 消息隊列的限制信息 sem_limits - 信號量的限制信息 進程列表 proclist - 進程列表 進程信息 proc_state - cmd, state, uid, gid proc_uid - uid, euid, gid, egid, pid, ppid, pgrp session, tty, tpgid, priority, nice proc_mem - size, vsize, resident, share, rss, rss_rlim proc_time - start_time, rtime, utime, stime, cutime, cstime, timeout, it_real_value, frequency proc_signal - signal, blocked, sigignore, sigcatch proc_kernel - k_flags, min_flt, maj_flt, cmin_flt, cmaj_flt, kstk_esp, kstk_eip, nwchan, wchan proc_segment - text_rss, shlib_rss, data_rss, stack_rss, dirty_size start_code, end_code, start_stack 進程映射 proc_map - 進程映射(Linux 下的/proc/<pid>/映射 文件系統使用信息: mountlist - 當前掛裝文件系統列表 fsusage - 文件系統使用信息 C.7 libpng PNG 指可移植的網絡圖象文件格式(Portable Network Graphic)。libpng 則是 PNG 規范對應的 C 函數庫,其目的是減少在應用程序中為支持 PNG 文件格式而需要花費的時間和精力。PNG 規范(RFC 2083)以及相關文檔、最新的 libpng 庫可從如下站點獲得: FTP://ftp.uu.net/graphics/png/documents/ /Article/UploadFiles/200511/20051103153926982.png.Html ftp://ftp.uu.net/graphics/png/documents/ http://www.cdrom.com/pub/png/ libpng 的最終目的是,在任何需要使用 PNG 文件格式的地方均能夠獲得 libpng 的支持。libpng 有如下特色: 可同時處理多個會話。 易於修改。 可移植到許多不同的平台上,包括ANSI、K&R、16-位、32-位以及 64-位等。 易於使用。 是線程安全的,可用於多線程的應用程序。 需要注意的是,libpng 使用 zlib 完成 PNG 文件的壓縮和解壓,因此,系統中需要安裝有 zlib 庫(下面講述)。 C.8 liBTiff libtiff 提供了對 TIFF(Tag Image File Format)的支持。TIFF 是廣泛用於保存圖象數據的格式。libtiff 包含如下功能: 讀寫 TIFF 的函數接口。 提供了在 UNIX 系統上對 TIFF 圖象進行簡單操作的工具。 C.9 GNU Libtool GNU Libtool 實際是一個腳本生成工具,它可以為軟件包開發者提供一般性的共享庫支持。 以前,如果源代碼包的開發者要利用共享庫的優點,則必須為每個軟件包可支持的平台編寫定制的支持代碼。並且還需要設計配置接口,以便軟件包的安裝程序能夠正確選擇要建立的庫類型。利用 GNU Libtool,則可以簡化開發者的這一工作。它在一個單獨的腳本中同時封裝了與平台相關的依賴性以及用戶界面。GNU Libtool 可使每個宿主類型的完整功能可通過一般性的接口獲得,同時為程序員隱藏了宿主的特殊性。 GNU Libtool 一致性接口是可靠的,用戶不必閱讀那些晦澀的文檔,以便在每個平台上建立共享庫。他們只需運行軟件包的配置腳本,而由 libtool 完成繁復的工作。 C.10 libungif GIF 是指 Graphics Interchange Format 規范。libungif 包含了一組用來處理 GIF 圖象的可移植工具和庫例程。最新版本可從如下站點獲得; http://www.ccil.org/~esr/giflib libungif包含了用來剪切、旋轉、縮放和定位 GIF 圖象的程序。包括一個 X11 查看器、將 GIF 輸出到 Epson 兼容打印機的的代碼,以及許多轉換工具。 函數庫中包括了讀取和寫入 GIF 文件的庫例程,在 GIF 文件中嵌入 8x8 字體的工具函數,以及錯誤處理例程等。 C.11 svgalib svgalib 是一個底層圖形庫,可在 Linux 的虛擬終端上運行。svgalib 支持許多常見的 SVGA 卡,包括 Trident TVGA 9440、S3 Trio64 等。 SVGA 包括如下功能: 函數庫的初始化; 查詢硬件配置,包括鼠標、芯片組和監視器; 設置顯示模式; 獲取顯示模式信息; 繪圖原語,包括畫點、掃描線等基本繪圖功能; 基本的鍵盤 I/O,區別於原始(RAW)模式; 直接的 VGA 內存訪問; 顏色調色板支持; 鼠標處理支持; 原始鍵盤處理,以原始訪問讀取鍵盤設備,從而可獲得對鍵盤的完全控制; 游戲棒支持; 虛擬終端切換功能; SVGA 卡的加速特性支持等。 C.12 zlib zlib 是一個通用的數據壓縮庫。代碼是線程安全的,可用於支持多線程應用程序。 zlib 庫支持的數據格式包括RFC 1950 到 1952 中描述的文件格式: zlib 格式,由ftp://ds.internic.net/rfc/rfc1950.txt 描述; deflate 格式,由ftp://ds.internic.net/rfc/rfc1951.txt 描述; gzip 格式:由ftp://ds.internic.net/rfc/rfc1952.txt 描述; C.13 字符界面函數庫 UNIX 系統對字符界面的支持是非常完善的。在 Linux 系統中,可在如下幾個層次上進行字符界面編程: 1.利用 ANSI 的標准輸入/輸出函數,例如 printf,scanf 等。 2.利用 termcap 函數庫。termcap 函數庫實際利用定義在 TERMinal CAPabilitie (終端能力,/etc/termcap)數據庫中的信息獲得對如下特殊操作的支持: 特殊字符的顯示; 字符的插入、刪除以及行的插入、刪除等操作; 終端初始化。 但是 termcap 函數庫只提供了對終端的底層訪問,而顏色屬性、參數化輸出和優化等工作,需要應用程序自己完成。 3.使用 terminfo 數據庫。TERMinal INFOrmation (終端信息,usr/lib/terminfo/[A-z][0-9])基於 termcap 數據庫,也提供了對終端能力的描述,但較 termcap 高級。利用 terminfo 數據庫,程序可方便地改變屏幕屬性,並使用諸如功能鍵在內的特殊按鍵。 4.curses 函數庫。curses 函數庫基於 terminfo 數據庫提供了更加高級的終端訪問能力。利用 curses 可打開並操作屏幕上的窗口,而且 curses 還提供了完整的輸入和輸出函數集合,可修改 150 種之多的終端的視頻屬性。 5.ncurses 函數庫。ncurses 是對 ncrses 函數庫的提高和擴展。它和 SVr4 兼容,並提供了某些擴展,包括顏色操作、輸出的特殊優化等等。在 Linux 系統中,ncurses 是使用最為廣泛的字符界面函數庫,許多基於字符界面的配置工具,如 netconf,均是基於 ncurses 的程序。