本书是UNIX系统编程的经典教材,并基于最新的UNIX标准进行了更新,其内容完全覆盖文件、信号、POSIX线程、UDP、Web和客户机-服务器等相关内容,并对通信、并发和多线程问题进行了透彻的研究,对复杂的概念进行了全面、完善以及明晰的解释,并以此而闻名。本书不仅提供了大量实例和练习,还专门设计了有针对性的项目,并给出了参考答案,帮助读者理解相关的概念,增强应用能力。本书适合作为高等院校计算机专业教材,也可供软件开发人员参考。本书前言前言:本书是1995年PrenticeHall出版的《PracticalUNIXProgramming:AGuidetoCommunication,ConcurrencyandMultithreading》的第2版。为了更好地反映本书的内容,我们修改了书名(英文版)。同上一版相比,除了书名,我们还对许多地方进行了修改。因特网已经成为计算和社会领域中的一个主导因素。我们的个人信息联网了,我们的软件经常会受到攻击。因此,编写正确的代码显得更加重要。在新的版本中,我们尽量去生成能够正确地处理错误和特殊情况的代码。我们知道,只是声称“处理了所有的错误”,却在给出的代码示例中省略掉错误处理,是没有什么说服力的。但是,错误处理使代码变得更加复杂,我们想尽力使代码清晰一些。本书对前一版的另一个重大改进就是采用了单一UNIX规范,在本书中我们称之为POSIX。我们再也不用为选用哪个厂商的库函数而发愁了—现在已有正式的版本了。在编写本书的过程中,我们尽了最大的努力来遵循这个标准。本书与众不同之处是含有练习和项目章。实际上,本书就是从一个项目手册发展而来的,这个项目手册是美国国家科学基金课题(NationalScienceFoundationGrant)的一部分。在完成这个项目的初期开发之后,我们逐渐认识到:完成这个项目所需的资料分散在很多地方—通常可以在那些提供了大量细节但很少进行概念描述的参考书中找到这些资料。这样,这本书就逐步演变成一本基于最新UNIX标准的完备的参考书了。本书分为四个部分,每个部分中都包括一些主题章和项目章。主题章以循序渐进的方式涵盖了特定的资料,其中有很多例子和小练习。本书还针对进程管理、并发和通信过程中的很多基本概念提供了编程练习(即项目章)。这些编程练习和传统科学课程中的实验作用相当。只有通过实践,才能真正理解书中的概念。这些练习的难度由浅入深,很多练习都只要不到100行的代码就可以实现。下表对本书的结构进行了总结。有14个主题章,这些主题章与8个项目章相互独立。第一次通读本书时可以略过项目章。项目章通过开发一个扩展的应用将几个主题章中的资料整合起来。这些项目包含两个层面:除了说明编程思想之外,还引导读者去理解与应用相关的更高级的主题。这些项目都是分阶段设计的,大多数完整的实现都只需要几百行代码。由于不需要编写大量的代码,因此读者可以将注意力集中在对概念的理解而不是代码的调试上。为了简化编程,我们提供了网络通信和日志输出的库。对专业的程序员来说,主题章结尾处的练习提供了基本的练习内容。通常,使用本书的教师可以在一个学期的课程中挑选几个练习和一个项目章让学生们实现。每个项目都有很多变化,因此这些项目可以在多个学期中反复使用。读者可以选择不同的方式来读这本书。第一部分中的主题章是学习本书其他部分的基础。读完第一部分的主题章之后,读者就可以按任意的顺序来学习第二部分到第四部分了。但后继各章结尾处有关交互(例如,线程是怎样与信号交互的)的讨论除外。我们假定读者是一名很好的C程序员,尽管不一定是UNIXC的程序员。读者应该熟悉C语言编程和基本的数据结构。如果你刚刚接触UNIX,附录A中给出了程序开发的一些必备知识。本书中包括标准函数的概要,在“概要”的右下角列出了用来说明函数的相关标准。知识的更新如此之快,然而书的内容却是有限的。我们欢迎读者给我们提出意见和建议。读者可以给我们发电子邮件authors@usp.cs.utsa.edu。我们尽了最大的努力来编写一本无差错的书。但是,如果你是第一个向我们指出某个错误的人,我们会在本书的网站上向你表示诚挚的谢意。我们在Web站http://usp.cs.utsa.edu/usp上提供了与本书相关的信息。本书包含的所有代码都可以从这个Web站点上下载。译者序:本书是一本介绍UNIX系统的工作原理以及学习UNIX系统程序编写方法的经典教材。对于程序员来说,本书同样是一本不可多得的案头必备参考书。读者在掌握了操作系统、C语言以及计算机网络的基本知识后学习本书,会发现本书将使读者对UNIX系统的理解登上一个新的高度,并将读者编写多线程和网络通信程序的能力提高到一个新的境界。本书有以下几个突出特点:其一,在讲述基本概念时,本书围绕主题设计了大量实例程序和练习来加深读者对概念的理解;其二,在各部分的最后,作者精心设计了生动有趣的项目来总结各部分的主要内容。这些项目,例如破解命令解释程序、WWW重定向、因特网音频广播、服务器性能等的取材都有很强的实际应用背景,稍加完善就是一个可用的程序;其三,本书采用了最新的UNIX标准:SingleUNIXSpecification,并在书中加入了大量的最新信息,如火星探路者中的优先级反转缺陷等。另外,本书各章末尾处的扩展阅读也给读者指出了相关领域经典的或最新的参考资料并进行了细致的评价,对读者进一步研究提供了很好的指导。如果您希望了解并掌握操作系统接口及其工作原理,我们相信本书将是一本合适的教材及参考书;如果您已经具备了初步的UNIX程序编写能力,本书将会引领您进入系统程序编写者的行列;如果您已经是一个熟练的系统程序员了,本书丰富的内容实例、充实的知识架构也一定会让您对计算机系统的理解有新的升华。本书的第20、21、22章由赵振平翻译,其他部分由陈涓翻译。郭传雄和赵振平校阅了全书。致谢我们非常感谢MikeSpeciner和BobLynch,他们通读了全部手稿,并提出了很多有益的建议。我们尤其要对MaryLouNohr细心睿智的编辑工作表示感谢。我们还要对NealWagner和RadiaPerlman给予的鼓励和建议表示感谢。从1988年至今(2003年),我们为大学本科生和研究生开设了操作系统课程,本书中很多资料都曾作为这些教学课程的一部分使用。学习此课程的学生们都经历了书稿发展的不同阶段,并对不断出现的项目进行了实际的测试。他们提供的程序故障、注释、抱怨和建议都使本书更加出色,并且使我们对这些主题之间的相互联系有了更深刻的认识。在早期书稿中发现错误的学生有JosephBell、CarlosCardenas、IgorGrinshpan、JasonJendrusch和JamesManion。我们要感谢美国国家科学基金会通过NSF-ILI授权的USE-0950497对我们组建实验室提供的支持,这样我们才有机会去开展最初的课程,而这些课程正是本书的基础。NSF(DUE-975093、DUE-9752165和DUE-0088769)还为开发那些用来探索和分析操作系统概念的工具提供了支持。我们要感谢PrenticeHall的编辑GregDoench在整个过程中为我们提供的指导,还要感谢我们的出版编辑WilliamMara使此书得以出版。我们用对本书进行了排版,的制作者提供了可以免费使用的软件,我们还要向他们表达我们的谢意。我们特别要感谢我们的家人,他们给了我们无限的爱和支持,尤其要感谢我们的孩子Nicole和Thomas,他们对这项艰巨的任务表示了热情和理解。