Unix 环境高级编程

作者:David Bausum
Advanced Programming in the Unix Environment
  • 作者:W. Richard Stevens

  • 出版社:Addison Wesley Longman Inc.

  • URL: http://www.awl.com/cp/

  • 价格:$63.43 美元

  • ISBN: 0-201-56317-7

  • 评论员:David Bausum

《Unix 环境高级编程》不是一本新书;它首次出版于 1992 年。然而,正是这本 Unix 编程书籍让我确信,我可以将我的一个项目从 DOS 移植到 Linux。

项目

1992 年,我编写了一个大型程序,旨在处理数据广播公司 (Data Broadcasting Corporation) 提供的实时股票市场数据馈送(参见 http://www.dbc.com/)。该程序是交互式的,它允许用户显示和打印(以文本和图形模式)关于股票、期权和市场指数的当前和历史数据。在后台,程序接收串行数据(通过卫星传输到 DBC 提供的连接到 PC 串行端口的“黑匣子”),将数据分解为事务,将事务存储在数据库中,并根据用户指令将事务馈送到显示模块。我使用 Watcom 的 32 位编译器在 DOS 系统上编写了这个程序,并利用了 DOS 可以寻址的大部分 16MB 内存。

几年后,我开始发现 DOS 的 16MB 限制具有约束性,并开始寻找新的工作环境。大约在同一时间,我收到了一本《Linux Journal》的样刊。那一期(第 14 期,1995 年 6 月)的封面上印有“智能串口板”字样——这些字引起了我的注意。那时,我已经升级了我的程序以与 Digiboard 配合使用,我知道迁移到新操作系统的一个要求将包括能够使用它或其他智能板。我订阅了《LJ》,并开始寻找与 Linux/Unix 相关的书籍。

当我八十年代初开始编程时,我通过阅读我称之为“无名”书籍的书籍学习了 Basic 和 FORTRAN。我的意思是这些书或其作者的风格都没有什么令人难忘的地方。相比之下,我从 McCracken 学习了 Cobol,从 Kernighan 和 Ritchie 学习了 C。任何熟悉这两本书的人都会认识到这些书与“无名”书之间的区别。我意识到,如果我希望将我的 DOS 应用程序移植到 Linux,我需要找到一本能够像 Kernighan 和 Ritchie 的书对 C 所做的那样对 Unix 起作用的书籍。

书籍

在 1995 年下半年和 1996 年上半年,我不断遇到 W. Richard Stevens 撰写的 《UNIX 环境高级编程》的参考文献。1996 年春天,我订购了这本书,事实证明它完全符合我的期望。

这是一本大书——超过 2 英寸厚,超过 750 页。它是精装本,打开时可以平放。这是一本有吸引力的书——封面和整体页面布局都是如此。在序言中,Stevens 说他使用 troffgroff 来格式化和准备这本书的照相排版稿。作为一个为不止一本书准备过稿件的人,我知道一本有吸引力的书不会凭空出现。它需要专业知识和时间,而 Stevens 的努力使读者在阅读这本书的过程中更加愉快。

本书讨论了各种 Unix 库使用的 220 多个函数。当引入一个函数时,它会被放在一个框中,其中包含函数所需的系统 include 文件、关于函数返回值的信息以及函数原型。本书包含超过 10,000 行源代码(全部用 C 编写),并充满了许多小型程序示例。代码可通过 FTP 获取,并由 Stevens 在四种 Unix 版本上进行了测试。本书包含许多表格,这些表格将特定类型的标志或其他信息组合在一起。它有许多图表,显示了讨论项目之间的关系。在适当的情况下,它会包含示例的输出,并使用它来阐明或强调当前的讨论项目。它在包含的 Unix 变体(如下所列)的上下文中完成这些事情。在必要时,会针对每个变体描述一个主题。对于一个不太优秀的作者来说,百科全书式的细节可能会让人感到窒息,但 Stevens 用足够的文本包围了上述所有项目,使本书非常易读,并且是一本非常有价值的参考书。

在序言中,Stevens 将本书分为 6 个部分,并简要描述了每个部分。以下是一个略有不同的分类,并附有更长的描述。

第 1 部分包含第 1-6 章(160 页)。前两章温和地介绍了 Unix 和对包含的 Unix 变体的讨论。它们是 SVR4,其历史可以追溯到 1990 年;4.3+BSD,指的是 1992 年初 BSD 的状态;以及 POSIX.1,其历史可以追溯到 1990 年。本部分其余四章(超过 100 页)讨论了文件、目录、访问权限、inode、文件 I/O 和特殊文件,例如密码文件。这些材料重复了 Kernighan 和 Ritchie 书中的第 8 章“Unix 系统接口”,但它更详细,并讨论了更多主题。

第 2 部分包含第 7-9 章(100 页)。这些章节处理进程。讨论的主题包括

  • 进程启动和停止时会发生什么

  • 如何访问程序参数和环境变量

  • 内存分配

  • 进程资源限制

  • 通过 fork 和 exec 创建进程

  • 进程 ID 和其他属性

  • 父进程和子进程之间的关系

第 3 部分包含第 10-12 章(150 页)。在这个阶段,我们大约完成了本书的三分之一,进展还算顺利。但这种情况在这一部分发生了变化。第 10 章处理信号,第 11 章处理终端 I/O,第 12 章处理高级终端 I/O。一旦 Stevens 描述了 30 多个可用信号中的每一个,他就展示了早期版本的 Unix 中的信号是如何不可靠的。然后,他描述了 POSIX.1 引入的使信号可以安全使用的函数。幸运的是,这些 POSIX 安全函数在 Linux 中可用。他对终端 I/O 的处理从检查 termio 结构开始,该结构包含 50 多个特殊标志(或开关)、在输入期间被特殊处理的字符和波特率。他展示了如何获取和保存这些值。他描述了规范(即面向行)和非规范 I/O。同样,我发现他的讨论非常适用于 Linux。第 12 章处理了第 1 部分和第 11 章中讨论的 I/O 系统的各种补充。包含的一些主题是非阻塞 I/O、记录锁定、流、多路复用(通过 select 或 poll)、异步 I/O 和内存映射 I/O。select 函数在 Linux 中可用,但我不认为所有这些主题都可用——尚未。

第 4 部分包含第 13-15 章(100 页)。第 13 章是关于守护进程的简短章节。第 14 章和第 15 章处理进程间通信。该讨论从管道开始,并在 80 页之后以两组用于客户端-服务器程序的功能示例结束。Stevens 在他 1990 年出版的 《UNIX 网络编程》(Prentice Hall 出版社)一书中更详细地处理了第 15 章的一部分。

第 5 部分包含第 16-18 章(115 页)。在这个阶段,我们已经完成了本书的三分之二,“高级”在标题中开始显现(对于这位 DOS 程序员而言)。本部分的每一章都致力于开发一个单独的程序或库——一个数据库程序、一个 PostScript 打印机程序和一个调制解调器拨号器。我花了几天时间研究打印机程序,并学习内核和几个守护进程使用的日志记录工具的工作原理。

第 6 部分包含 1 章、3 个附录、一个参考文献和一个索引(120 页)。第 19 章处理伪终端。附录 A 非常有价值,提供了本书中介绍的所有函数的 20 页摘要。这些材料按字母顺序排列,包括函数原型、返回值、所需的系统 include 函数以及介绍该函数的页码的参考。附录 B 提供了本书中许多示例使用的源代码。附录 C 提供了每章末尾的一些练习的解答。索引相当完整(25 页)。

当我读完一本书时,我会根据几个标准来决定是否可以推荐它。它现在放在哪里:我的桌子上,桌子附近的书堆里,还是放在遥远的架子上?这本书在一般意义上有趣,还是它改变了我的思维或行为方式?Stevens 的书放在我的桌子上,经常打开到某个特定的地方。此外,它给了我许多想法,我正在将这些想法用于将我的股票程序移植到 Linux。三个例子是串口 I/O、协调多个工作进程和错误信息。

第 11 章使我在 Linux 下运行标准串口和我的 Digiboard 都相对轻松。第 10 章让我产生了将 Unix 信号和定时器添加到我的 DOS 程序中央工作循环的想法。这使我可以使用与 DOS 程序相同的程序结构。此外,它允许程序在没有工作时休眠,并在有工作时唤醒。因此,它将是 Linux “友好的”。第 13 章和第 17 章以及附录 B 向我展示了如何在特殊文件中记录错误。使用一行代码,我的程序可以调用一个函数,该函数写入标准错误、程序特定日志文件或两者都写入。该调用使用带有可变数量参数的 printf() 格式,并且可以结束程序或返回到调用函数。

结论

多年来,我一直认为编程和建造是相关的。从 DOS 编程迁移到 Linux 就像从木框架房屋建造过渡到使用混凝土、钢铁和玻璃建造摩天大楼。这种转变需要理解新材料以及它们如何相互作用。这正是 Stevens 的书提供的信息。他描述了基本的库调用,在小型代码段中使用它们,并将它们组合成几个更大的项目。我衷心推荐这本书,并希望您的收获能和我一样好。

David Bausum 于 1974 年在耶鲁大学获得数学博士学位。自 80 年代初以来,他的大部分精力都投入到软件开发和相关活动中。他与人合编了《军事史杂志累积索引:第 1-58 卷,1937-1994 年》。可以通过电子邮件 davidb@cfw.com 与他联系。

加载 Disqus 评论