本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第1章,第1.10节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.10 Unix标准
在编写本书时,最引人注目的Unix标准化活动是由Austin公共标准修订组(The Austin Common Standards Revision Group,CSRG)主持的。他们的努力结果是涵盖1 700多个编程接口的约4 000页内容的规范[Josey 2002]。这些规范既具有IEEE POSIX名字,也具有开放团体的技术标准(The Open Group’s Technical Standard)名字。其结果是同一个Unix标准有多个名字来指称:ISO/IEC 9945:2002、IEEE Std 1003.1-2001和单一Unix规范第3版(Single Unix Specification Version 3)都指同一个标准。本书中除了像本节这样需要讨论各种较早期标准各自特性的章节外,我们简单地称这个Unix标准为POSIX规范(The POSIX Specification)。
获取这个统一标准的最简易方法是定购其CD-ROM拷贝或通过Web免费访问。
1.10.1 OSIX的背景
POSIX(可移植操作系统接口)是Portable Operating System Interface的首字母缩写。它并不是单个标准,而是由电气与电子工程师学会(the Institute for Electrical and Electronics Engineers, Inc.)即IEEE开发的一系列标准。POSIX标准已被国际标准化组织即ISO和国际电工委员会(the International Electrotechnical Commission)即IEC采纳为国际标准(这两个组织合称为ISO/IEC)。下面是POSIX标准的发展简史。
第一个POSIX标准是IEEE Std 1003.1-1988(317页)。它详述了进入类Unix内核的C语言接口,涵盖了下述领域:进程原语(fork、exec、信号和定时器)、进程环境(用户ID和进程组)、文件与目录(所有I/O函数)、终端I/O、系统数据库(口令文件和用户组文件)以及tar和cpio归档格式。
第一个POSIX标准在1986年是称为“IEEE-IX”的试用版。POSIX这个名字是由Richard Stallman建议使用的。
第二个POSIX标准是IEEE Std 1003.1-1990(356页),也称为ISO/IEC 9945-1: 1990。从1988版本到1990版本只做了少量的修改。新添的副标题为“Part 1: System Application Program Interface (API) [C Language]”,表明本标准为C语言API。
下一个标准是两卷本的IEEE Std 1003.2-1992(约1300页)。它的副标题为“Part 2: Shell and Utilities”。这一部分定义了shell(基于System V的Bourne Shell)和大约100个实用程序(通常从shell启动执行的程序,如awk、basename、vi和yacc等等)。本书称这个标准为POSIX.2。
再下一个标准是IEEE Std 1003.1b-1993(590页),先前称为IEEE P1003.4。这是对1003.1-1990标准的更新,添加了由P1003.4工作组开发的实时扩展。1003.1b-1993相比1990年版标准新增的条目包括:文件同步、异步I/O、信号量、存储管理(mmap和共享内存)、执行调度、时钟与定时器以及消息队列。
更下一个标准是IEEE Std 1003.1 1996年版[IEEE 1996](743页),也称为ISO/IEC 9945-1: 1996,它包括1003.1-1990(基本API)、1003.1b-1993(实时扩展)、1003.1c-1995(pthreads)和1003.1i-1995(对1003.1b的技术性修订)。该标准增添了3章关于线程的内容,并另有关于线程同步(互斥锁和条件变量)、线程调度和同步调度的各节。本书称这个标准为POSIX.1。该标准还有一个前言,其中声明ISO/IEC 9945由下面3个部分构成。
Part 1: System API (C language)——第1部分:系统API(C语言)。
Part 2: Shell and utilities——第2部分:Shell和实用程序。
Part 3: System administration——第3部分:系统管理(正在开发中)。
第1部分和第2部分就是我们所说的POSIX.1和POSIX.2。
743页中有超过四分之一的篇幅是一个标题为“Rationale and Notes”(理由与注解)的附录。该附录含有历史性信息和某些特性被加入或删除的理由。这些理由通常跟正式标准一样有教益。
最后一个标准是在2000年被认可⑩的IEEE Std : Protocol-independent interfaces (PII)。在单一Unix规范第3版(The Single Unix Specification Version 3)面世之前,这是与本书涵盖的主题最为相关的POSIX产品。它是联网API标准,它定义了两个API,并称它们为详尽网络接口(Detailed Network Interface,DNI)。
DNI/Socket,基于4.4BSD的套接字API。
DNI/XTI,基于X/Open的XPG4规范。
这个标准的工作作为P1003.12工作组(后来改名为P1003.1g)起始于20世纪80年代后期。本书称这个标准为POSIX.1g。
1.10.2 开放团体的背景
开放团体(The Open Group)是由1984年成立的X/Open公司(X/Open Company)和1988年成立的开放软件基金会(Open Software Foundation,OSF)于1996年合并成的组织。它是厂商、工业界最终用户、政府和学术机构共同参加的国际组织。下面是开放团体制定的标准的简要背景。
X/Open公司于1989年出版了X/Open Portability Guide(X/Open移植性指南,XPG)第3期,即XPG3。
XPG第4期即XPG4出版于1992年,其第2版出版于1994年。这个最新版本也称为“Spec 1 ,其中魔数1170是系统接口数(926个)、头文件数(70个)和命令数(174个)的总和。这组规范的最终名字是X/Open Single Unix Specification(X/Open单一Unix规范),也称为“Unix 95。
单一Unix规范第2版于1997年3月发行。符合这个规范的产品称为“Unix 98”。本书就称这个规范为“Unix 98”。Unix 98的接口数目从1170个增长到1434个,而用于工作站的接口数则达到3 030个,因为它包含公共桌面环境(Common Desktop Environment,CDE),而公共桌面环境又需要X Windows系统和Motif用户接口。Unix 98为套接字API和XTI API定义了网络支持服务。这个规范与POSIX.1g几乎相同。
不幸的是,X/Open称它们的网络标准为XNS:X/Open Networking Services。定义Unix 98套接字和XTI的文档的这一版本称为“XNS Issue (XNS第5期)。在网络界,XNS已是Xerox Network Systems体系结构的简称。所以,我们避免使用XNS,而称这个X/Open文档为Unix 98网络API标准。
1.10.3 标准的统一
如本节开头所提,伴随Austin CSRG发布单一Unix规范第3版,POSIX和开放团体都继续发展,达成统一的标准。CSRG促成50多家公司就单一标准达成一致意见,这在Unix发展史上确实是一件划时代之大事。如今大多数Unix系统都符合POSIX.1和POSIX.2的某个版本,不少系统符合单一Unix规范第3版。
历史上多数Unix系统或者源自Berkeley,或者源自System V,不过这些差别在慢慢消失,因为大多数厂商已开始采纳这些标准。然而在系统管理的处理上两者仍然存在较大差别,这个领域目前还没有标准可循。
本书的焦点是单一Unix规范第3版,其中又以套接字API为主。只要可能,我们就使用标准函数。
1.10.4 因特网工程任务攻坚组
因特网工程任务攻坚组(Internet Engineering Task Force,IETF)是一个由关心因特网体系结构的发展及其顺利运作的网络设计者、操作员、厂商和研究人员联合组成的开放的国际团体。它向任何感兴趣的个人开放。
因特网标准处理过程在RFC 2026[Bradner 1996]中说明。因特网标准一般处理协议问题而不是编程API,不过仍有两个RFC(RFC 3493[Gilligan et al. 2003]和RFC 3542[Stevens et al. 2003])说明了IPv6的套接字API。它们是信息性的RFC,并不是标准,制定它们的目的是加速部署由多家从事IPv6工作较早的厂商所开发的可移植网络应用程序。尽管标准主体趋于花费很长的时间,其中许多API却已经在单一Unix规范第3版中标准化了。