Richard Stevens & Stephen Rago:advanced Programming In The Unix Environment@2013 (第3版)

提供的資料主要闡述了《Advanced Programming in the UNIX Environment, Third Edition》這本書的核心內容、目標讀者、涵蓋範圍、以及其所基於的 UNIX 系統標準和實作版本。這是一本旨在深入解釋 UNIX 系統應用程式開發介面的技術書籍,特別關注系統呼叫和標準 C 函式庫提供的服務。

核心目的與價值

本書的核心目的是為嚴謹的程式設計師和網路專業人員提供一份內容翔實且實用的參考資料,詳細描述並解釋 UNIX 系統的程式設計介面。這不僅包括直接與核心互動的「系統呼叫」,也包括建立在系統呼叫之上但被絕大多數 C 程式使用的「函式庫常式」。作者認為,這些介面在官方文件(如 UNIX 程式設計師手冊的 Section 2 和 Section 3)中通常只提供簡潔的描述,而本書的價值在於提供豐富的「範例」和「原理」,幫助讀者深入理解這些介面的實際使用和背後原因。

內容範圍與組織

書籍內容圍繞 UNIX 程式設計介面展開,涵蓋了從基本概念到進階主題的多個方面。章節組織大致可分為以下幾個部分:
1. 概述與基礎 (Chapter 1 & 2): 介紹 UNIX 系統架構、檔案與目錄、輸入輸出、程式與程序、錯誤處理、使用者識別等基本概念。特別強調了 UNIX 標準化(如 ISO C、IEEE POSIX 和 Single UNIX Specification)以及不同實作(如 System V 和 BSD 變體)的歷史與現狀,並解釋如何移植地處理系統限制與選項。
2. 檔案 I/O (Chapter 3-6): 深入探討非緩衝 I/O (open, read, write, lseek, close)、檔案與目錄的屬性、標準 I/O 函式庫的緩衝機制與使用、以及系統資料檔案(如密碼檔、群組檔)的存取。
3. 程序控制與環境 (Chapter 7-10): 詳細講解程序環境(命令列參數、環境變數、記憶體佈局)、程序控制(fork, exec, waitpid, exit)、程序間的關係(程序群組、會話、控制終端)以及訊號處理(訊號概念、可靠訊號機制、訊號集)。
4. 多執行緒程式設計 (Chapter 11-12): 介紹執行緒概念,以及如何建立、管理和同步多個執行緒。
5. 進階 I/O 與程序間通訊 (Chapter 13-17): 涵蓋精靈程序、進階 I/O 技術(非阻塞 I/O、檔案鎖定、I/O 多工、非同步 I/O)、以及各種程序間通訊(IPC)機制(管道、FIFO、訊息佇列、號誌、共享記憶體、通訊端 Socket)。
6. 終端機 I/O 與實例研究 (Chapter 18-21): 討論終端機 I/O 的複雜性,並透過大型實例(如資料庫函式庫、網路印表機通訊)來展示之前介紹的程式設計技術在實際應用中的結合使用。

標準化與實作的關係

書中一個重要的論點是強調標準化(如 ISO C、POSIX.1、Single UNIX Specification)在提高應用程式可移植性方面的作用。作者詳細介紹了這些標準的演進,並說明了它們如何試圖統一不同 UNIX 版本間的程式設計介面。然而,作者也務實地指出,標準只規定了「介面」,而「實作」可能存在差異(如可選功能的支持程度、某些限制的具體值、某些歷史性功能的行為)。

為了真實反映標準與實作的關係,本書以四個主要的 UNIX 系統實作版本作為測試平台:
* FreeBSD 8.0
* Linux 3.2.0 (Ubuntu 12.04 發行版)
* Mac OS X 10.6.8 (Darwin 10.8.0)
* Solaris 10

書中大量範例程式碼都在這四個平台上進行測試,並在必要時註明各平台之間的行為差異。這提供了比單純描述標準更為實際和豐富的資訊。特別是 Single UNIX Specification,它定義了符合「UNIX」商標認證的實作必須支持的介面集,書中將這視為事實上的 UNIX 程式設計介面標準。

系統限制與可移植性

書中強調了移植程式設計需要注意的另一個關鍵點:系統定義的各種「限制」和「選項」。例如,檔案名稱的最大長度、程序可以打開的最大檔案數、是否支援特定的訊號處理行為等。有些限制可以在編譯時通過包含特定的標頭檔來得知,有些則需要在執行時通過 sysconf 或 pathconf/fpathconf 等函式來查詢。作者詳細解釋了如何利用這些標準機制來編寫更具移植性的程式碼,避免硬編碼那些可能因系統而異的數值或行為。同時,也指出了一些限制(如某些資源限制)的實際值可能是不確定的,這為編寫絕對可移植的程式碼帶來了挑戰,並討論了應對這些不確定性的策略。

錯誤處理

UNIX 系統函式通常通過返回值和全域變數 errno 來指示錯誤。本書介紹了 errno 的概念、常用的錯誤碼、以及 strerror 和 perror 等輔助函式來產生錯誤訊息。強調了在多執行緒環境下 errno 的特殊處理(通常是每個執行緒獨立一份)。書中的範例廣泛使用了自定義的錯誤處理函式庫,以簡化錯誤檢查和報告的程式碼。

程序識別與管理

書中詳細介紹了程序的各種識別碼(實體使用者/群組 ID、有效使用者/群組 ID、儲存設定使用者/群組 ID),這些識別碼用於檔案存取權限檢查和程序特權管理。特別是關於 set-user-ID 和 set-group-ID 程式的安全性考量,以及如何安全地切換特權。

總結

總而言之,這本書提供的資料揭示了其作為一本深入探討 UNIX 程式設計介面的權威書籍的地位。它不僅詳細描述了核心系統呼叫和函式庫常式的使用,更將這些介面置於標準化和多種實際實作的背景下進行講解,輔以大量的範例和對潛在問題(如緩衝、鎖定、訊號處理中的競態條件、移植性挑戰)的討論。其主要論點聚焦於:理解 UNIX 程式設計的基礎(檔案、程序、I/O、訊號)、掌握標準化介面(ISO C, POSIX, SUS)以提高可移植性、了解不同實作之間的差異以及如何處理系統限制和選項、以及如何利用這些介面來解決實際的系統程式設計問題(如程序間通訊、多執行緒同步、精靈程序)。

這份資料旨在為讀者建立對 UNIX 系統程式設計環境的全面理解,並為編寫健壯、高效且具移植性的應用程式提供堅實的基礎。