本节书摘来自异步社区《UNIX环境高级编程(第3版)》一书中的第2章,第2.2节,作者:【美】W. Richard Stevens , Stephen A.Rago著,更多章节内容可以访问云栖社区“异步社区”公众号查看
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接口。restrict关键字告诉编译器,哪些指针引用是可以优化的,其方法是指出指针引用的对象在函数中只通过该指针进行访问。
1999年以来,已经公布了3个技术勘误来修正ISO C标准中的错误,分别在2001年、2004年和2007年公布。如同大多数标准一样,在批准标准和修改软件使其符合标准两者之间有一段时间延迟。随着供应商编译系统的不断演化,对最新ISO C标准的支持也就越来越多。
按照该标准定义的各个头文件(见图2-1)可将ISO C库分成24个区。POSIX.1标准包括这些头文件以及另外一些头文件。从图2-1中可以看出,所有这些头文件在4种UNIX实现(FreeBSD 8.0、Linux 3.2.0、Mac OS X 10.6.8和Solaris 10)中都支持。本章后面将对这4种UNIX实现进行说明。
ISO C头文件依赖于操作系统所配置的C编译器的版本。FreeBSD 8.0配置了gcc 4.2.1版,Solaris 10配置了gcc 3.4.3版(以及Sun Studio自带的C编译器),Ubuntu 12.04(Linux 3.2.0)配置了gcc 4.6.3版,Mac OS X 10.6.8配置了gcc 4.0.1和4.2.1版。
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标准1003.1-1990正式出版[IEEE 1990],这也就是国际标准ISO/IEC 9945-1:1990。该标准通常称为POSIX.1,本书将使用此术语来表示不同版本的标准。
IEEE 1003.1工作组此后继续对这一标准做了更多修改。1996年,该标准的修订版发布,它包括了1003.1-1990、1003.1b-1993实时扩展标准以及被称为pthreads的多线程编程接口(POSIX线程),这就是国际标准ISO/IEC 9945-1:1996。1999年出版了IEEE标准1003.1d-1999,其中增加了更多实时接口。一年后,出版了IEEE标准1003.1j-2000和1003.1q-2000,前者包含了更多实时接口,后者增加了标准在事件跟踪方面的扩展。
2001年的1003.1版本与以前各版本有较大的差别,它组合了多个1003.1的修正、1003.2标准以及Single UNIX Specificaiton(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.1g-2000(协议无关接口)
- ISO/IEC 9945-2(IEEE标准1003.2-1993)
- IEEE P1003.2b草案(shell及实用程序的修正)
- IEEE标准1003.2d-1994(批处理扩展)
- Single UNIX Specification第2版基本说明,包括
- 系统接口定义,第5发行版
- 命令和实用程序,第5发行版
- 系统接口和头文件,第5发行版
- 开放组技术标准,网络服务,5.2发行版
- ISO/IEC 9899-1999,C程序设计语言
2004年,POSIX.1说明随着技术勘误得到更新,2008年做了更多综合的改动并作为基本说明的第7发行版发布,ISO在2008年底批准了这个版本并在2009年进行发布,即国际标准ISO/IEC9945:2009。该标准基于其他几个标准。
IEEE标准1003.1,2004年版。
开放组织技术标准,2006,扩展API集,第1~4部分。
ISO/IEC 9899:1999,包含勘误表。
图2-2、图2-3以及图2-4总结了POSIX.1指定的必需的和可选的头文件。因为POSIX.1包含了ISO C标准库函数,所以它还需要图2-1中列出的各个头文件。这4张图中的表也总结了本书所讨论的4种UNIX系统实现所包含的头文件。
本书中描述了POSIX.1 2008年版,其接口分成两部分:必需部分和可选部分。可选接口部分按功能又进一步分成40个功能分区。图2-5按各自的选项码总结了包含未弃用的编程接口。选项码是能够表述标准的2~3个字母的缩写,用以标识属于各个功能分区的接口,其中的接口依赖于特定选项的支持。很多选项处理实时扩展。
POSIX.1没有包括超级用户(superuser)这样的概念,代之以规定某些操作要求“适当的优先权”,POSIX.1将此术语的含义留由具体实现进行解释。某些符合美国国防部安全性指南要求的UNIX系统具有很多不同的安全级。本书仍使用传统的UNIX术语,并指明要求超级用户特权的操作。
经过20多年的工作,相关标准已经成熟稳定。POSIX.1标准现在由Austin Group开放工作组维护。为了保证它们仍然有价值,仍需经常对这些标准进行更新或再确认。
2.2.3 Single UNIX Specification
Single UNIX Specification(SUS,单一UNIX规范)是POSIX.1标准的一个超集,它定义了一些附加接口扩展了POSIX.1规范提供的功能。POSIX.1相当于Single UNIX Specification中的基本规范部分。
POSIX.1中的X/Open系统接口(X/Open System Interface,XSI)选项描述了可选的接口,也定义了遵循XSI(XSI conforming)的实现必须支持POSIX.1的哪些可选部分。这些必须支持的部分包括:文件同步、线程栈地址和长度属性、线程进程共享同步以及_XOPEN_UNIX符号常量(在图2-5中它们被加上“SUS强制的”的标记)。只有遵循XSI的实现才能称为UNIX系统。
Open Group拥有UNIX商标,他们使用Single UNIX Specification定义了一系列接口。一个系统要想称为UNIX系统,其实现必须支持这些接口。UNIX系统供应商必须以文件形式提供符合性声明,并通过验证符合性的测试,才能得到使用UNIX商标的许可证。
有些接口在遵循XSI的系统中是可选的,这些接口根据功能被分成若干选项组(option group),具体如下。
加密:由符号常量_XOPEN_CRYPE标记。
实时:由符号常量_XOPEN_REALTIME标记。
高级实时。
实时线程:由符号常量_XOPEN_REALTIME_THREADS标记。
高级实时线程。
Single UNIX Specification是Open Group的出版物,而Open Group是由两个工业社团X/Open和开放系统软件基金会(Open System Software Foundation,OSF)在1996年合并构成的。X/Open过去出版了X/Open Portability Guide(X/Open可移植性指南),它采用了若干特定标准,填补了其他标准缺失功能的空白。这些指南的目的是改善应用的可移植性,使其不仅仅符合已发布的标准。
X/Open在1994年发布了Single UNIX Specification第1版,因为它大约包含了1170个接口,因此也称为“Spec 1170”。它源自通用开放软件环境(Common Open Software Environment,COSE)的倡议,该倡议的目标是进一步改善应用程序在所有UNIX操作系统实现之间的可移植性。COSE的成员包括Sun、IBM、HP、Novell/USL以及OSF等,他们的UNIX都包含了通用商业化应用软件使用的接口,这较之仅仅赞同和支持标准前进了一大步。从这些应用软件的接口中选出的1170个接口被包括在下列标准中:X/Open通用应用环境(Common Application Environment,CAE)第4发行版(也被称为XPG4,以表示它与其前身X/Open Portability Guide的历史关系)、系统V接口定义(System V Interface Definition,SVID)第3版Level 1接口、OSF应用环境规范(Application Environment Specification,AES)Full Use接口。
1997年,Open Group发布了Single UNIX Specification第2版。新版本增加了对线程、实时接口、64位处理、大文件以及增强的多字节字符处理等功能的支持。
Single UNIX Specification第3版(SUSv3)由Open Group在2001年发布。SUSv3的基本规范与IEEE标准1003.1-2001相同,分成4个部分:基本定义、系统接口、shell和实用程序以及基本理论。SUSv3还包括X/Open Curses第4发行版第2版,但该规范并不是POSIX.1的组成部分。
2002年,ISO将IEEE标准1003.1-2001批准为国际标准ISO/IEC 9945:2002。Open Group在2003年再次更新了1003.1标准,包括了技术方面的更正。ISO将其批准为国际标准ISO/IEC 9945:2003。2004年4月,Open Group发布了Single UNIX Specification第3版2004年版,将更多技术上的更正合并到标准的正文中。
2008年,Single UNIX Specification再次更新,包括了更正和新的接口、移除弃用的接口以及将一些未来可能被删除的接口标记为弃用接口等。另外,有一些过去被认为可选的接口变成必选接口,其中包括异步I/O、屏障、时钟选择、存储映像文件、内存保护、读写锁、实时信号、POSIX信号量、旋转锁、线程安全函数、线程、超时机制以及时钟等。最终形成的标准就是基本规范的第7发行版,也即POSIX.1-2008。Open Group把这个版本和X/OPEN Curses规范的更新版打包,并于2010年作为Single UNIX Specification第4版发布。我们把这个规范称为SUSv4。
2.2.4 FIPS
FIPS代表的是联邦信息处理标准(Federal Information Processing Standard),这一标准是由美国*发布的,并由美国*用于计算机系统的采购。FIPS151-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已经撤回,所以在本书中我们不再进一步考虑它。