2.2 UNIX标准化
2.2.1 ISO C
1989年下半年,C程序设计语言的ANSI标准X3.159-1989得到批准。此标准已被采纳为国际标准ISO/IEC 9899: 1990。ANSI是美国国家标准学会(American National Standards Institute),它在国际标准化组织(International Organization for Standardization,ISO)中是代表美国的成员。IEC是国际电子技术委员会(International Electrotechnical Commission)的缩写。
ISO C标准现在由ISO/IEC的C程序设计语言国际标准化工作组维护和开发,该工作组被称为ISO/IEC JTC1/SC22/WG14,简称WG14。ISO C标准的意图是提供C程序的可移植性,使其能适合于大量不同的操作系统,而不只是UNIX系统。此标准不仅定义了C程序设计语言的语法和语义,还定义了其标准库[ISO 1999第7章;Plauger 1992;Kernighan及Ritchie 1988中的附录B]。因为所有现今的UNIX系统(例如本书介绍的几个UNIX系统)都提供C标准中定义的库例程,所以该标准库是很重要的。
在1999年,ISO C标准被更新为ISO/IEC 9899:1999。新标准显著改善了对进行数值处理的应用程序的支持。除了对某些函数原型增加了关键字restrict外,这些改变并不影响本书中说明的POSIX标准。该关键字用于告诉编译器,哪些指针引用是可以优化的,其方法是指明指针指向的对象,在函数中只通过该指针进行访问。
如同大多数标准一样,在批准标准和修改软件以使其符合标准这两者之间有一段时间上的延迟。随着供应商的编译系统不断演进,对ISO C标准最新版本的支持也越来越多。
gcc对ISO C标准1999版本的当前符合程度的总结可见:http://www.gnu.org/software/ gcc/c99status.html。
按照该标准定义的各个头文件(header),可将ISO C库分成24个区。表2-1中列出了C标准定义的各个头文件。POSIX.1标准包括这些头文件以及另外一些头文件。表中也列出了四种UNIX实现(FreeBSD 5.2.1、Linux 2.4.22、Mac OS X 10.3和Solaris 9)所支持的头文件。本章后面将对这四种UNIX实现进行说明。

ISO C头文件依赖于操作系统所配置的C编译器的版本。在考虑表2-1时,应当注意FreeBSD 5.2.1 配置了gcc 3.3.3版,Solaris 9同时配置了gcc 2.95.3版和gcc 3.2版,Mandrake 9.2(Linux 2.4.22)配置了gcc 3.3.1版,Mac OS X配置了gcc3.3版。Mac OS X还包括了gcc的较早版本。
2.2.2 IEEE POSIX
POSIX是一系列由IEEE(Institute of Electrical and Electronics Engineers,电气与电子工程师协会)制定的标准。POSIX指的是可移植的操作系统接口(Portable Operating System Interface)。它原来指的只是IEEE标准1003.1-1988(操作系统接口),后来则扩展成包括很多标记为1003的标准及标准草案,包括shell和实用程序(1003.2)。
与本书相关的是1003.1操作系统接口标准,该标准的目的是提高应用程序在各种UNIX系统环境之间的可移植性。它定义了“依从POSIX的”(POSIX compliant)操作系统必须提供的各种服务。该标准已被大多数计算机制造商采用。虽然1003.1标准是以UNIX操作系统为基础的,但是它并不限于UNIX和类似于UNIX的系统。确实,有些供应专有操作系统的制造商也声称这些系统将依从POSIX(同时还保有它们的所有专有功能)。
由于1003.1标准定义了一个接口(interface)而不是一种实现(implementation),所以并不区分系统调用和库函数。标准中的所有例程都称为函数。
标准是不断演变的,1003.1标准也不例外。该标准的1988版,即IEEE 1003.1-1988,经修改后提交给ISO。它没有增加新的接口或功能,但修订了文本。最终的文档作为IEEE Std.1003.11990正式出版[IEEE 1990],这也就是国际标准ISO/IEC 9945-1:1990。该标准通常被称为POSIX.1,本书将使用此标准。
IEEE 1003.1工作组继续对标准做出修改,并在1993年出版了IEEE 1003.1标准的修订版。它包括了1003.1-1990标准和1003.1b-1993实时扩展标准。1996年,该标准再次更新为国际标准ISO/IEC 9945-1:1996。它包括了多线程编程的接口,称为pthreads,指的就是POSIX线程。1999年出版了IEEE标准1003.1d-1999,其中增加了更多实时接口。一年后,出版了IEEE标准1003.1j-2000和1003.1q-2000,前者包含了更多实时接口,后者增加了标准在事件跟踪方面的扩展。1003.1的2001版与以前各版本有较大的差别,它组合了1003.1的多次修订、1003.2标准以及Single UNIX Specification(SUS)第2版的若干部分(对于SUS,后面将作更多说明)。最终形成了IEEE标准1003.1-2001,其中包括了下列几个标准。
• ISO/IEC 9945-1(IEEE标准1003.1-1996),它包括
• IEEE标准1003.1 - 1990。
• IEEE标准1003.1b - 1993(实时扩展)。
• IEEE标准1003.1c- 1995(pthreads)。
• IEEE标准1003.1i- 1995(实时技术勘误表)。
• IEEE P1003.1a标准草案(系统接口修订版)。
• IEEE标准1003.1d - 1999(高级实时扩展)。
• IEEE标准1003.1j - 2000(更高级的实时扩展)。
• IEEE标准1003.1q - 2000(文件跟踪)。
• IEEE标准1003.2d - 1994(批处理扩展)。
• IEEE P1003.2b草案标准(附加的实用程序)。
• IEEE标准1003.1g - 2000(协议无关接口)的某些部分。
• ISO/IEC 9945-2(IEEE标准1003.2 - 1993)。
• Single UNIX Specification第2版的基本规范,包括
• 系统接口定义,第5发行版。
• 命令和实用程序,第5发行版。
• 系统接口和头文件,第5发行版。
• 开放组技术标准,网络服务,5.2 发行版。
• ISO/IEC 9899:1999,C编程语言。
表2-2、表2-3以及表2-4总结了POSIX.1指定的必需和可选的头文件。因为POSIX.1包括ISO C标准库函数,所以它还需要表2-1中列出的头文件。这4个表总结了本书所讨论的4种UNIX系统实现中包括的头文件。



本书中描述了POSIX.1的2001版,包括ISO C标准所指定的各个函数。其接口分成了两类:必需接口和可选接口。可选接口按功能又进一步分成50个区。表2-5中按它们各自的选项代码总结了没有被弃用的编程接口。选项代码是由2~3个字符构成的字母缩写,以便标识属于各个功能区的接口。选项代码会突出显示手册相关页面上的文本,表明接口依赖于对特定选项的支持。很多选项处理实时扩展。



POSIX.1没有包括超级用户(superuser)这样的概念,代之以规定某些操作要求“适当的特
权”,POSIX.1将此术语的定义留由具体实现进行解释。某些符合美国国防部安全性指南的UNIX 系统具有很多不同的安全级。本书仍使用传统的UNIX术语,并指明要求超级用户特权的操作。
经过近20年的工作,相关标准已经成熟稳定。POSIX.1标准现由称为Austin Group (http://www.opengroup.org/austin)的开放工作组维护。为了保证它们与实际需求吻合,仍需经常对这些标准进行更新或再修订。
2.2.3 Single UNIX Specification
Single UNIX Specification(单一UNIX规范)是POSIX.1标准的一个超集,定义了一些附加的接口,这些接口扩展了基本的POSIX.1规范所提供的功能。相应的系统接口全集被称为X/Open系统接口(XSI, X/Open System Interface)。__XOPEN_UNIX符号常量标识了(相对于基本POSIX.1接口而言)XSI扩展的接口。
XSI还定义了实现必须支持POSIX.1的哪些可选部分才能认为是遵循XSI(XSI conforming)的。它们包括文件同步、存储映射文件、存储保护及线程接口,并在表2-5中标明是“SUS强制要求”。只有遵循XSI的实现才能称为UNIX系统。
Open Group拥有UNIX商标,并且使用Single UNIX Specification来定义一个实现必须支持的接口,这样的实现才能称为UNIX系统。实现必须以文件形式提供符合性声明,并通过验证符合性的测试包测试,以及得到使用UNIX商标的许可。
在XSI中定义的某些附加的接口是必需的,其他的则是可选的。依据常用的功能,接口被分成如下若干选项组(option group):
• 加密:由符号常量_XOPEN_CRYPE标记。
• 实时:由符号常量_XOPEN_REALTIME标记。
• 高级实时。
• 实时线程:由符号常量_XOPEN_REALTIME_THREADS标记。
• 高级实时线程。
• 跟踪。
• XSI STREAMS(流):由符号常量_XOPEN_STREAMS标记。
• 遗留接口:由符号常量_XOPEN_LEGACY标记。
Single UNIX Specification(SUS)由Open Group发布,Open Group成立于1996年,由两个
业界社团X/Open和Open Software Foundation(OSF)合并而成。X/Open过去一直在出版
X/Open Portability Guide(X/Open可移植性指南),它采用了若干特定标准,填补了其他标准缺失功能的空白。这些指南的目的是改善应用程序的可移植性,使其不仅仅符合已出版的标准。
Single UNIX Specification的第一个版本由X/Open 在1994年出版,因为它大约包含了1170 个接口,因此也被称为“Spec 1170”。它源自Common Open Software Environment(COSE)的倡议,该倡议的目标是进一步改善应用程序在所有UNIX操作系统实现之间的可移植性。COSE 组的成员包括Sun、IBM、HP、Novell/USL以及OSF,该组织较之仅仅支持标准前进了一大步。此外,他们调查了若干常见的商业应用程序所使用的接口,并从中选出了1170 个接口。这些接口也包括在下列各标准中:X/Open Common Application Environment(CAE)第4发行版(称为XPG4,以表示它与其前身X/Open Portability Guide的历史关系)、System V Interface Definition(SVID,系统V接口定义)第3版、Level 1接口、OSF Application Environment Specification (AES)Full Use 接口。Single UNIX Specification第2版由Open Group在1997年出版。新版本增加了对一些功能的支持,包括线程、实时接口、64位处理、大文件以及增强的多字节字符处理等。Single UNIX Specification第3版(简写为SUS v3)由Open Group在2001年出版。SUS v3的基本规范与IEEE标准1003.1-2001相同,分成4部分:基本定义、系统接口、Shell和实用程序以及基本理论。SUS v3还包括X/Open Curses Issue 4第2版,但该规范并不是POSIX.1的组成部分。
2002年,ISO将该版本批准为国际标准ISO/IEC 9945:2002。Open Group在2003年再次更新
了1003.1标准,使其包括了技术方面的更正,ISO将其批准为国际标准ISO/IEC 9945:2003。
2004年4月,Open Group出版了Single UNIX Specification第3版,2004版本。它包括了对标准主要正文更多在技术上的更正。
2.2.4 FIPS
FIPS的含义是联邦信息处理标准(Federal Information Processing Standard)。它由美国政府出版,用于计算机系统的采购。FIPS 151-1(1989年4月)基于IEEE标准1003.1-1988及ANSI C 标准草案。此后是FIPS 151-2(1993年5月),它基于IEEE标准1003.1-1990。某些在POSIX.1中列为可选的功能,在FIPS 151-2中是必需的。所有这些可选功能在POSIX.1-2001中已成为强制性要求。
POSIX.1 FIPS的影响是:它要求任何希望向美国政府销售POSIX.1兼容的计算机系统的厂
商应支持POSIX.1的某些可选功能。因为POSIX.1 FIPS的影响正逐步减退,所以在本书中我们将不再进一步考虑它。







