多數(shù)精致復雜的程序涉及某種形式的IPC,也就是進程間通信(InterprocessCommuni-cation)。它是一個程序設計原則的自然結果,即把應用程序設計成一組彼此通信的小片段是比設計成單個龐大的程序更好的方法。從歷史上看,應用程序設計方式按如下的順序漸次出現(xiàn):1.完成全部工作的單個龐大的程序。整個程序的各種片段可作為函數(shù)實現(xiàn),它們以函數(shù)參數(shù)、函數(shù)返回值及全局變量的形式彼此交換信息。2.使用某種形式的IPC彼此通信的多個程序。許多標準Unix工具就是以這種樣式設計的,它們使用shell管道(一種IPC形式)從一個程序向下一個程序傳遞信息。3.由使用某種形式的IPC彼此通信的多個程序構成的單個程序。盡管這種通信發(fā)生在線程間而不是進程間,我們仍用IPC的說法來描述。把后兩種設計方式結合起來也是可能的:由多個進程組成,每個進程又由一個或多個線程構成,其中涉及給定進程內各線程間的通信以及不同進程間的通信。到此為止所描述的是把完成一個給定應用所涉及的工作散布到多個進程中,也許還散布到進程內的線程中。在含有多個處理器(CPU)的系統(tǒng)上,多個進程可能(在不同的CPU上)同時運行,一個給定進程的多個線程也可能同時運行。因此,把一個應用的工作散布到多個進程或線程中有可能減少該應用完成給定任務的時間。本書具體敘述4種不同形式的IPC:1.消息傳遞(管道、FIFO、消息隊列)2.同步(互斥鎖、條件變量、讀寫鎖、文件與記錄鎖、信號燈)3.共享內存區(qū)(匿名共享內存區(qū)、有名共享內存區(qū))4.遠程過程調用(Solaris 門、Sun RPC)本書不討論通過計算機網絡通信的程序的編寫。這種通信形式通常涉及使用TCP/IP協(xié)議族的所謂的套接口API(應用程序編程接口);這些主題在本叢書的第1卷[Stevens1998]中詳細討論。有人可能堅稱單臺主機內的即不涉及網絡的IPC(正是本卷的主題)不應該使用,相反,所有應用程序都應該編寫成通過網絡運行在各種主機的分布式應用程序。然而實踐證明,單臺主機內的IPC與穿越網絡的通信相比,前者往往快得多,有時還簡單些。諸如共享內存區(qū)和同步這樣的技術通常只在單臺主機上可用,穿越網絡時可能沒法用。經驗與歷史告訴我們,不涉及網絡的IPC(本卷)和穿越網絡的IPC(本叢書第1卷)都有用武之地。本書構筑在同一套叢書第1卷以及作者的其他4本書的基礎之上,它們的書名在全書中縮寫如下:·UNPvl:UNIX Network Programming,Volume 1[Stevens 1998]·APUE:Advanced Programming in the UNIX Environment [Stevens 1992]TCPv1:TCP/IP Illustrated,VOlume 1[Stevens 1994]TCPv2:TCP/lP Illustrated,VOlume 2[Wright and Stevens 1995]TCPv3:TCP/IP Illustrated,Volume 3[Stevens 1996]盡管在以“網絡編程”為書名的叢書中討論IPC看起來可能奇怪,IPC卻往往用在網絡應用程序中。這正如在“UNIX Network Programming” 1990年版的前言中所說:“理解如何給一個網絡開發(fā)軟件的必要條件之一是理解進程間通信(IPC)”。