多数精致复杂的程序涉及某种形式的IPC,也就是进程间通信(InterprocessCommuni-cation)。它是一个程序设计原则的自然结果,即把应用程序设计成一组彼此通信的小片段是比设计成单个庞大的程序更好的方法。从历史上看,应用程序设计方式按如下的顺序渐次出现:1.完成全部工作的单个庞大的程序。整个程序的各种片段可作为函数实现,它们以函数参数、函数返回值及全局变量的形式彼此交换信息。2.使用某种形式的IPC彼此通信的多个程序。许多标准Unix工具就是以这种样式设计的,它们使用shell管道(一种IPC形式)从一个程序向下一个程序传递信息。3.由使用某种形式的IPC彼此通信的多个程序构成的单个程序。尽管这种通信发生在线程间而不是进程间,我们仍用IPC的说法来描述。把后两种设计方式结合起来也是可能的:由多个进程组成,每个进程又由一个或多个线程构成,其中涉及给定进程内各线程间的通信以及不同进程间的通信。到此为止所描述的是把完成一个给定应用所涉及的工作散布到多个进程中,也许还散布到进程内的线程中。在含有多个处理器(CPU)的系统上,多个进程可能(在不同的CPU上)同时运行,一个给定进程的多个线程也可能同时运行。因此,把一个应用的工作散布到多个进程或线程中有可能减少该应用完成给定任务的时间。本书具体叙述4种不同形式的IPC:1.消息传递(管道、FIFO、消息队列)2.同步(互斥锁、条件变量、读写锁、文件与记录锁、信号灯)3.共享内存区(匿名共享内存区、有名共享内存区)4.远程过程调用(Solaris 门、Sun RPC)本书不讨论通过计算机网络通信的程序的编写。这种通信形式通常涉及使用TCP/IP协议族的所谓的套接口API(应用程序编程接口);这些主题在本丛书的第1卷[Stevens1998]中详细讨论。有人可能坚称单台主机内的即不涉及网络的IPC(正是本卷的主题)不应该使用,相反,所有应用程序都应该编写成通过网络运行在各种主机的分布式应用程序。然而实践证明,单台主机内的IPC与穿越网络的通信相比,前者往往快得多,有时还简单些。诸如共享内存区和同步这样的技术通常只在单台主机上可用,穿越网络时可能没法用。经验与历史告诉我们,不涉及网络的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年版的前言中所说:“理解如何给一个网络开发软件的必要条件之一是理解进程间通信(IPC)”。