本书讲述了Solaris操作系统的系统编程接口。尽管本书书名中使用了“Solaris”一词,但本书也适用于UNIX或UNIX操作系统的程序员(也就是说,本书描述的某些特征是针对Solaris的)。.
与大部分操作系统一样,Solaris也为程序员提供了大量的服务。例如,打开文件、读取文件、分配内存、获取当前时间、启动新程序等。本书描述了许多公共接口,但是无论如何努力,也不可能详细讲解一切(面面俱到的书将冗长无比,而且永远也不可能写成这样的书)。
因为使用未提供说明文档的接口难以写出可移植的程序,所以本书不讲解这样的接口。同时,使用专有、未提供文档说明的接口缺少Sun的应用证书,因为这些接口可能在无告示的情况下随版本的变化而更改。
本书所描述的函数(接近540个)在Solaris“Reference Manual Collection”的第二部分和第三部分提供了文档说明。不过,这些手册页没有提供背景材料和完整的实例,而本书正好提供了这些内容。
读者对象
本书既可作为初级和中级程序员的指导书,也可作为有经验程序员的参考书,它还适合作为本科生或研究生的编程课程的教材。
本书假定读者具备C编程的一些经验(但不一定需要UNIX平台上的编程经验),而且至少对UNIX的一些概念具有基本的了解,如与shell的交互、用文本编程器进行编辑和管道操作。
强烈建议读者使用可以调试本书示例的Solaris系统(但不作绝对要求)。
本书的组织方式
本书分为6部分:
·第一部分:综述。这一部分提供了介绍性知识和历史背景信息,包括2章:
·第1章概述了许多基本UNIX编程概念和术语。
·第2章描述了Solaris的发展历史,还介绍了Solaris所兼容的若干不同标准。
·第二部分:基本主题。这一部分讲解接口以及UNIX编程中的重要知识,包括7章:
·第3章介绍了用于操作字符类、字符字符串和字节数组的大部分实用工具函数,还介绍了动态内存、临时文件、解析命令行参数、错误报告以及进程挂起。许多读者可能熟悉其中的大部分材料,但它提供了我们起步的通用起点。
·第4章描述了低层次的文件I/O,包括如何打开和关闭文件、如何读写文件以及如何更改当前文件偏移,还讨论了文件共享和缓存(使用这些函数的程序必须针对它们进行缓存)。
·第5章描述了高层次的I/O函数,它们由标准I/O库所提供。
·第6章描述了如何获取和设置系统时钟,以及在不同格式间转换时间的不同函数。
·第7章描述了用户、组和口令文件的格式,以及如何从这些文件获取信息。这一章还解释了如何判断登录系统的用户、用户最后一次登录或退出的时间。
·第8章描述了如何获取和设置不同系统和用户资源限制,如进程可以占用的CPU时间大小、每个进程可以打开的最大文件数量、系统主机名等信息、安装的内存大小等。
.·第9章描述了程序中的若干常见安全性缺陷(如缓存溢出),还介绍了一些编写程序的技巧,这些技巧在设计上是安全的。
·第三部分:输入/输出。这一部分描述了Solaris提供的I/O功能,包括4章:
·第10章描述了文件和目录的特征以及操作它们时可以使用的函数。这一章介绍了不同的文件类型等概念,文件权限,解析符号性链接,创建、读取和删除目录,还介绍了设置用户ID和设置组ID程序。
·第11章解释了如何读取磁盘上用于文件系统的数据结构、如何挂载和卸载以及如何读取挂载的文件系统表。
·第12章讨论了终端I/O,包括特殊输入字符、检查和修改终端属性。还介绍了用于操作串行的函数(如更改波特率和每个字符的位数)。
·第13章介绍了更高级的I/O主题,如记录锁定、非阻塞、多路复用和异步I/O。这一章还讨论了内存映射文件、访问控制表以及扩展的文件属性。
·第四部分:进程和进程控制。这一部分介绍进程及进程控制的相关知识,包括5章:
·第14章描述了运行UNIX进程的环境,还介绍了进程的启动和终止。
·第15章介绍了如何创建新进程以及如何启动另一个运行的程序。这一章还介绍了如何等待进程的终止状态、如何避免竞争条件以及进程记账。..
·第16章解释了会话、进程组和控制终端的概念。
·第17章描述了可靠和不可靠信号的概念,包括如何发送信号、捕获信号、阻塞信号以及忽略信号。
·第18章描述了守护进程的特征,并介绍了进程如何变成守护进程。还介绍了将消息记人日志的工具以及如何只启动守护进程的一个拷贝。
·第五部分进程间通信。这一部分介绍进程间相互进行通信的工具,包括4章:
·第19章介绍了最古老但也许使用最频繁的进程间通信方法:管道和FIFO。这一章还介绍了交互式和并发式服务器的区别。
·第20章介绍了System V消息队列、信号量集和共享内存片段。
·第21章介绍了向其他进程传递文件描述符的概念,其他进程既包括关联进程,也包括非关联进程。这一章还介绍了如何从文件系统中的文件名上附加和去除管道。
·第22章介绍了Solaris门,它用于同一主机上进程间的快速远程过程调用。
·第六部分:伪终端。这一部分介绍伪终端,只包括1章:
·第23章介绍了什么是伪终端,以及如何创建伪终端。然后,介绍了如何通过伪终端执行其他程序,这对于脚本程序有用,否则,这些程序必须交互式运行。
本书还包括5个附录:
·附录A简短介绍了国际化和本地化的相关知识。也就是介绍了文化区域的概念,以及如何编写可移植到不同语言和区域的程序。
·附录B简要介绍了BSD源代码兼容性包。这个包是一个过渡性工具,它设计用于让编写的程序兼容基于BSD的SunOS 4.x API。
·附录C总结了本书介绍的所有函数。在介绍每个函数的函数原型(包括所有返回值)的同时,还介绍了每个函数的用途(针对Solaris版本和标准)。
·附录D介绍了大部分示例程序中包含的头文件的源代码,还介绍了为在示例程序中使用而开发的库函数的源代码。
·附录E提供了许多章末练习的答案。
源代码和勘误
本书中所有示例的源代码均可从作者的主页下载(网址参见后面)。学习本书所介绍的接口和技术的最好途径是编写和修改这些程序。实际编写代码(也许使用这些示例作为起点)是完全理解这些概念和技术的唯一途径。
本书中的所有示例均在多个系统(包括SPARCstation 20、SPARCstation Voyager、几种Ultra 1、Sun Blade 100和Ultra 60)上进行了测试,运行了若干不同的Solaris版本。它们使用Sun的C编译器(5.4版本)和gcc的2.95.2版本进行编译。这些示例还在许多运行Solaris x86的系统上通过了测试。
现在,本书的勘误可从作者的主页下载。
致谢
感谢我的家庭,他们在三年多中付出了爱心和支持。感谢Jenny和Judse(我们的宠物),他们陪伴我度过了漫长的写作时间。现在,本书定稿,我的妻子和儿女又可以与我共享天伦之乐了。还感谢家庭中的其他成员和朋友,在我写作期间,他们给予我支持和鼓励。感谢你们每一个人!
感谢如下技术审校人员,他们提供了有价值的反馈,找出了大量错误,指出了需要更加详述的地方,并对不同的措辞、阐述、代码提出了建议:Philip Brown、Alan Coopersmith、Casper Dik、Stefaan Eeckels、Peter Baer Galvin、Alexander Gelfenbain、Anthony Mandic、Chris Morgan、David Robinson。还要特别感谢Dragan Cvetkovic,他审阅了整个手稿。
下列人员在百忙中回答我在电子邮件中提出的问题(有时所提问题不少),这一切均有助于提高本书的准确性和全面性:Dave Butenhof、Dennis Clarke、Alan Coopersmith、Casper Dik、Darren Dunham、Bill Fenner、Markus Gyger、ZhishunAlex Liu、Darren Moffat、Jim Moore、Alec Muffet、Greg Onufer、David Robinson、Karl Schendd、Andy Tanenbaum和Tony Walton。
特别要感谢W.Richard Stevens,感谢他在本书构思之初给予的鼓励。也要感谢Addison-Wesley的Michael Slaughter,是他最初与我进行联系,并促成了本书的付梓。
感谢Bill Moffitt和Karen Hill,是他们安排我参加了Solaris 9 Beta课程。还要感谢Sun Microsystems公司提供了SunONE Studio 7 Compiler Collection的授权。
最后,感谢Prentice Hall的工作人员:Kathleen Caren、Raquel Kaplan,特别要感谢我的编辑Greg Doench。他们对于我增加篇幅、多次延期以及“自由发挥”表现出了极大的耐心,非常感谢他们(作者是一位居住在加拿大的英国人,使用的是英式英语)。当然,还有很多需要感谢的人没有在此罗列出来。
后记
本书沿袭了使用vi和troff编写真正UNIX书籍的传统。在运行Solaris 10 Build 60的Sun Ultra 60上,我使用James Clark的优秀groff包生成可立即使用的PostScript。我使用vi编辑器输入了所有417 259个字,使用gpic程序制作了84幅插图,使用gtbl程序生成了91个表,制作了所有索引(使用Jon Bentley和Brian Kernighan编写的awk脚本集),并且完成了最后的排版。我自己的脚本c2ms、expand程序、nl实用工具以及其中一个sed脚本用于包含本书中源代码的12 619行(281个程序)。
欢迎读者来信提出建议,指出错误。...
电子邮件:rich.teer@rite-group.com
个人主页:http://www.rite-group.com/rich
Rich Teer
加拿大不列颠哥伦比亚省基洛纳市
2004年7月