UNIX变体的激增产生了许多兼容性问题,特别是各种商业UNIX变体的出现使情况变得更加复杂。系统V和BSD在许多方面不同—它们有不同且互不兼容的物理文件系统、网络机制和虚拟内存结构。这些不同中有一些限制在内核设计和实现上,但另一些出现在程序设计接口层,这导致没有一个复杂的应用程序能够不加修改地同时运行于系统V和BSD系统。另一方面,商业变体常常带有各自的增值特征,应用程序员常常搞不清它们。结果,为了保证程序在各种不同的UNIX上都能工作,程序员不得不付出极大的努力。这种情形导致了对UNIX标准的需求,并有一些小组开始这项工作。但所产生的标准为数众多且各不相同。最终,大部分UNIX公司同意了几种标准,包括较早的AT&T 的系统V 接口定义(System V Interface Definition,SVID)、X/Open移植指南,以及后来公认的IEEE POSIX标准和统一UNIX规范。每一种标准涉及的是程序员和操作系统之间的接口而不是系统如何实现这个接口,它们定义了一组函数和这些函数的详细语义。与标准兼容的系统必须满足这些规定,但可以在内核或用户级别的库中来实现这些函数。
1988年AT&T出版了《系统V接口定义》(SVID)。SVID定义了UNIX系统库和命令接口,它本质上是系统V程序设计接口的详细规定。之后AT&T出版了另一个版本的SVID2和SVID3。这三个版本分别对应于SVR2、SVR3和SVR4。此外,AT&T还提供了系统V验证包(System V Verification Suite,SVVS),它由一组验证系统是否遵循SVID的实用程序组成。AT&T很严格地对待SVID,仅当遵循SVID时,AT&T才允许厂商标志他们的操作系统为“系统V”。这对于许多厂商而言是十分困难的,因为增加新的功能或修改操作系统可能妨碍其版本通过SVVS一致性测试。结果,厂商不得不选择要么提供一个与UNIX系统V兼容但放弃了用户要求功能的操作系统,要么提供一个与SVID标准不兼容并且也不能吸引用户的系统,因为用户担心被某个特定UNIX商业版本锁定。于是,产生了另外的标准POSIX和X/Open。
1986年美国电子和电气工程师协会IEEE指定了一个委员会正式形成试用标准POSIX 1003.1,这是关于可移植操作系统计算机环境标准的第一次尝试。因为AT&T保留了UNIX 名字的所有权,因此该标准使用POSIX(Portable Operating System Interface based on UNIX)作为其名称。这个委员会的成员很多来自于Uni Forum(正式名称为/user/group Standards Committee),他们采纳了早期/user/group建议的可移植操作系统标准草案,该标准基本上是SVR3的内核部分和4.3BSD UNIX的混合。自此以后,POSIX委员会提议了该标准的若干规范并且成立了10个子委员会,其目的是产生一个关于可移植操作系统环境的ISO标准。1988年出版了该标准的“草案1.3”,之后被ISO采纳。POSIX 1003.1正式标准(即POSIX.1)于1990年出版,之后陆续补充了其他几个标准,包括IEEE POSIX 1003.1b-1993、IEEE POSIX 1003.1c-1995、IEEE POSIX 1003.1i-1995,它们一起成为IEEE POSIX 1003.1-1996。除此之外,IEEE还出版了涉及UNIX的其他方面的另外一系列标准。POSIX 1003.1-1996自颁布后便不断更新,目前的最新标准是POSIX 1003.1-2008。POSIX的出现使得用户能够遵循由正式标准化组织承认的标准。此外,POSIX允许转换遵循POSIX的调用至目标操作系统的调用,如DEC-OpenVMS和微软的Windows NT。反过来说,任何操作系统都可以在源代码级用POSIX调用重写,因而用户可以继续使用他们喜欢的操作系统(不必是UNIX)。现代UNIX实现都采纳了POSIX 1003.1,因而提供了源代码级的可移植性。
就在POSIX标准刚刚起步并使人们看到UNIX归于统一的希望之后不久,1987年,AT&T 面对公众反对其许可证策略的压力,宣布和Sun合作开发SVR4,即下一代AT&T系统V UNIX版本。AT&T称Sun可以得到优惠对待,这在UNIX开发商中引起了强烈的反应,他们担心会给Sun不公平的优惠。Digital、IBM、HP、Apllo和其他几个主要公司于1988年联合起来宣布成立开放软件基金会(Open Software Foundation)。OSF计划重写UNIX操作系统,该操作系统将遵循POSIX标准并增加窗口系统(X11)、图形用户接口(Motif)、分布计算环境(DCE)、分布管理环境(DME)和其他特征。所有这些都将最终脱离AT&T许可的约束。作为回应,AT&T和Sun以及其他基于系统V的投资商在1988年立即成立了另一个称为UNIX International(UI)的组织。UI致力于将SVR4推向市场并建议制定UNIX系统V的方向。1990年UI发布了UNIX System V Road Map,规划了UNIX未来的开发方向。OSF和UI开始时是竞争对手,但很快便面临共同的外部挑战。20世纪90年代初微软Windows市场的骤增对UNIX的发展和生存构成了威胁。于是UI于1993年停止了工作,而OSF也放弃了许多不太明确的计划。另一方面,1991年AT&T将其UNIX版权卖给Novell。但许多开发商认为在另一个公司的控制下发展UNIX并不比以前更好,担心Novell会限制UNIX的开放性。于是在1993年,计算机工业界的主要系统和软件厂商一致倡议,由 X/Open将UNIX操作系统规范标准化。与此同时,Novell宣布将UNIX商标权无偿移交给X/Open,以便在开放系统开发商中统一UNIX。X/Open成立于1984年,它是一个将有兴趣按事实上的国际标准发展开放公共应用环境(CAE)的计算机系统投资商联合在一起的独立非盈利的财团。X/Open接管UNIX后,计算机工业界消除了在UNIX技术和策略上近25年的分歧,开始集中致力于向市场推出一个统一的UNIX标准,以便为UNIX系统创建一个统一版本的市场。所有主要的厂商均同意保证他们的操作系统产品将遵循一个统一的UNIX标准规范(Single UNIX Specification)。这一组规范最早包括1170个独立的应用程序接口(API,也称为Spec1170),它使市场能够从这个唯一的、标准的操作系统受益,使得应用和信息具有可移植性,使得顾客具有选择的自由和灵活性。在X/Open的组织和推动下,1995年正式颁布了X/Open CAE规范4.2,其中包含了UNIX的两个重要标准Spec1170 API和公共桌面环境(Common Desktop Environment,CDE)。Spec1170 API在程序设计一级规定了UNIX的标准接口,并且包含了POSIX标准和ISO C标准中的所有函数。X/Open允许任何遵循该标准规范的系统称为UNIX95。这个标准为UNIX的统一化、标准化打下了重要基础。1996年,X/Open与OSF合并成立了The Open Group。1997年,The Open Group颁布了统一UNIX标准版本2(Single UNIX Specification,Version 2),这个新版本增加了对实时、线程以及64位处理机的支持。1998年,The Open Group提出了以UNIX98命名的品牌族,它由基础(Base)、工作站(Workstation)和服务器(Server)三部分组成。UNIX98 Base包括了IEEE POSIX 1003.1-1996、IEEE POSIX 1003.2-1992、ISO/IEC 9899:1990、ISO/IEC 9899:1990/Amendment 1:1995(E)等正式标准以及XPG4标准,它包含了对标准化线程、实时、大文件系统应用的支持,解决了64位问题,并且与体系结构无关。UNIX98 Workstation 包含了CDE,一个主要UNIX系统开发商均提供的标准图形用户界面。UNIX98 Server 则包含了标准化的Web服务,如对JavaTM虚拟机、TCP/IP、SNMP、超文本协议传输服务、域名服务等的支持。1998年,来自ISO/IEC 第一联合技术委员会、IEEE可移植应用标准委员会和The Open Group的一些成员一起成立了一个联合工作组Austin Group。1999年,IEEE和The Open Group在Austin Group工作组的基础上开始修订统一UNIX规范,并于2003年正式颁布了统一UNIX规范版本3。这个规范包容了IEEE Std 1003.1-2004(POSIX.1)和ISO/IEC 9945:2003(ISO-POSIX),增强了一些新的特征,如增强了线程和实时同步函数,增加了向FIPS 151-2看齐的作业控制和某些选项,去掉了一些过时的特征,允许有选择地实现如STREAM等特征。Open Group在颁布统一UNIX规范版本3的同时也提出了UNIX 03产品认证标志,通过了UNIX 03符合性测试、与统一UNIX规范相一致的系统可以使用该标志。目前,所有主流UNIX系统(包括Linux)均实现了这个规范。之后,随着POSIX.1 2008和C标准ISO/IEC9945:2009的颁布,The Open Group也颁布了新的统一UNIX规范版本4,而与之对应的产品认证标志则更新为UNIX V7。统一UNIX规范是一个开放标准,如果操作系统满足这个规范,并且可以在其上运行普遍流行的程序,则认为这个系统是开放的系统。遵循标准有利于程序的可移植性,本书将介绍统一UNIX规范版本4中主要的编程接口函数,你所学到的方法可以应用于任何UNIX系统(Linux、AIX、IRIX、Solaris等)。
C程序设计语言的ANSI C标准X3.159-1989于1989年颁布,次年被国际标准化组织采纳为国际标准ISO/IEC 9899:1990,也简称ISO C标准。该标准的目的是对所有操作系统,不仅仅是UNIX,提供一个可移植的、一致的程序设计语言。随着C语言的扩充,C标准也在不断更新,目前最新的C标准为国际标准化组织颁布的ISO/IEC 9945:2009。C标准不仅定义了C语言的语法和语义,同时还定义了C语言的标准库。C标准库对我们是重要的,因为统一UNIX规范不能与任何ISO/IEC标准冲突,因此,属于该库中的任何函数都将自动成为统一UNIX规范的一部分,它要么已经被The Open Group当前标准收纳,要么是在当前标准已颁布之后ISO/IEC的新的修正,对于后一种情况则会自动被The Open Group标准的下一版本所采纳。
相关资源:Unix/Linux 编程实践教程.PDF