《Linux系统编程(第2版)》——1.3 标准

简介: UNIX系统编程是门古老的艺术。UNIX编程的基础理念在几十年来一直根深蒂固。但是,对于UNIX系统,变化却是无处不在。各种行为不断变化,特性不断增加。为了使UNIX世界变得有序,标准化组织为系统接口定义了很多套官方标准。

本节书摘来自异步社区《Linux系统编程(第2版)》一书中的第1章,第1.3节,作者:【美】Robert Love著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.3 标准

UNIX系统编程是门古老的艺术。UNIX编程的基础理念在几十年来一直根深蒂固。但是,对于UNIX系统,变化却是无处不在。各种行为不断变化,特性不断增加。为了使UNIX世界变得有序,标准化组织为系统接口定义了很多套官方标准。虽然存在很多这样的官方标准,但是Linux没有遵循任何一个标准。相反地,Linux致力于和两大主流标准兼容:POSIX和单一UNIX规范(Single UNIX Specification,SUS)。

除了其他内容,POSIX和SUS为类UNIX操作系统定义了一套C API。该C API为兼容的UNIX系统定义了系统编程接口,至少从中抽取出了通用的API集。

1.3.1 POSIX和SUS的历史
在20世纪80年代中期,电气电子工程师协会(IEEE)开启了UNIX系统上的系统级接口的标准化工作。自由软件运动(Free Software Movement)的创始人Richard Stallman建议把该标准命名成POSIX(发音[pahz-icks]),其全称是Portable Operating System Interface(可移植操作系统接口)。

该工作的第一成果是在1988年获得通过的IEEE std 1003.1-1988(简称POSIX 1988)。1990年,IEEE对 POSIX标准进行了修订,通过了IEEE std 1003.1-1990(POSIX 1990)。后续的修订IEEE Std 1003.1b-1993(POSIX 1993或称POSIX.1b)和IEEE Std 1003.1c-1995(POSIX 1995或称POSIX.1c)分别描述了非强制性的实时和线程支持。2001年,这些非强制性标准在POSIX 1990的基础上进行整合,形成单一标准IEEE Std 1003.1-2001(POSIX 2001)。最新的标准IEEE Std 1003.1-2008 (POSIX 2008)在2008年12月发布。所有的核心POSIX标准都简称为POSIX.1,其中2008年的版本为最新版。

从20世纪80年代后期到20世纪90年代初期,UNIX系统厂商卷入了一场“UNIX之战”中,每家厂商都处心积虑地想将自己的UNIX变体定义成真正的“UNIX”操作系统。几大主要的UNIX厂商聚集在了工业联盟The Open Group周围,The Open Group是由开放软件基金会(Open Software Foundation,OSF)和X/Open合并组成。The Open Group提供证书、白皮书和兼容测试。在20世纪90年代初,正值UNIX之战如火如荼,The Open Group发布了单一UNIX规范(SUS)。SUS广受欢迎,很大原因归于SUS是免费的,而POSIX标准成本很高。今天,SUS合并了最新的POSIX标准。

第一个版本的SUS发布于1994年,然后在1997年和2002年分别发布了两个修订版SUSv2和SUSv3。最新的SUSv4在2008年发布。SUSv4修订结合了IEEE Std 1003.1-2008标准以及一些其他标准。本书将以POSIX标准介绍系统调用和其他接口,原因是SUS是对POSIX的扩展。

1.3.2 C语言标准
Dennis Ritchie和Brian Kernighan的经典著作《C程序设计语言》(Prentice Hall)自1978年首次出版后,一直扮演着非正式的C语言规范的角色。这个版本的C语言俗称K&R C。C语言很快替代了Basic语言和其他语言,成为微型计算机编程的通用语言。因此,为了对当时已经非常流行的C语言进行标准化,美国国家标准协会(ANSI)成立了委员会制定C语言的官方版本。该版本集成了各个厂商的特性和改进,并借鉴了新兴的C++语言的一些经验。这个标准化过程漫长而又艰辛,但是ANSI C在1989年最终顺利完成。1990年,国际标准化组织(ISO)基于ANSI C做了一些有效修改,批准了ISO C90。

1995年,ISO发布了新版的C语言标准ISO C95,虽然该标准很少被执行。在1999年,对C语言做了很多修订,形成了ISO C99标准,它引入了很多新的特征,包括inline函数、新的数据类型、变长数组、C++风格的注释以及新的库函数。该标准的最新版本是ISO C11,该版本最重要的功能是格式化的内存模型,支持跨平台的线程可移植性。

对于C++,ISO标准化进展却非常缓慢。经过几年的发展以及非向前兼容的编译器的发布,通过了第一代C++标准ISO C98。虽然该标准极大地提高了编译器之间的兼容性,但在某些方面限制了一致性和可移植性。2003年通过了ISO C++03标准。它修复了编译器开发人员遇到的一些bug,但是没有用户可见的变化。下一个是目前最新的ISO标准C++11(之前的版本都是C++0x,C++11意味着该版本发布更令人期待),有更多的语言和标准的库附加组件及改进——由于修改非常多,很多人建议C++11作为一门不同的语言,和之前的C++版本区别开。

1.3.3 Linux和标准
正如前面所述,Linux旨在达到兼容POSIX和SUS。SUSv4和POSIX 2008描述了Linux提供的接口,包括支持实时(POSIX.1b)和线程(POSIX.1c)。更重要的是,Linux努力与POSIX与SUS需求兼容。一般来说,如果和标准不一致,就认为是个bug。人们认为Linux与POSIX.1和SUSv3兼容,但是由于没有经过POSIX或SUS的官方认证(尤其是Linux的每次修订),所以无法官方宣布Linux兼容POSIX或SUS。

关于语言标准,Linux很幸运。gcc C编译器兼容ISO C99,而且正在努力支持C11。g++ C++编译器兼容ISO C++03,正在努力支持C++11。此外,gcc和g++_实现了C语言和C++语言的扩展。这些扩展统称为GNU C,在附录A中有相关描述。

Linux的前向兼容做得不是很好[1],虽然近期这方面已经好多了。接口是通过标准说明的,如标准的C库,总是可以保持源码兼容。不同版本之间的二进制代码兼容是由glibc来保证的。由于C语言是标准化的,gcc总是能够准确编译合法的C程序,尽管gcc相关的扩展可能会废弃掉甚至从新的gcc发布版本中删除。最重要的是,Linux内核保证了系统调用的稳定性。一旦系统调用是在Linux内核的稳定版本上实现的,它就不会改变了。

在各种Linux发布版中,Linux标准规范(Linux Standard Base,LSB)对大部分的Linux系统进行了标准化。LSB是几大Linux厂商在Linux基金会(前身是自由标准组织)推动下的联合项目。LSB扩展了POSIX和SUS,添加了一些自己的标准;它尝试提供二进制标准,支持目标代码在兼容系统上无需修改即可运行。大多数Linux厂商都在一定程度上遵循了LSB标准。

1.3.4 本书和标准
本书有意避免对任何标准的介绍“夸夸其谈”。大多数情况下,UNIX系统编程相关的书籍都不应该浪费篇幅探讨以下内容:如某个接口在不同标准下行为有何不同,特定的系统调用在各个系统上的实现情况,以及类似的口舌之战。本书仅涉及在现代Linux系统上的系统编程,它是通过最新版本的Linux内核(3.9)、gcc编译器(4.8)和C库(2.17)来实现的。

因为系统接口通常是固定不变的(Linux内核开发人员尽力避免破坏系统调用接口),并且支持一定程度的源码和二进制兼容性。因此,我们可以深入探索Linux系统接口的细节,不必关心与各种其他的UNIX系统和标准的兼容性问题。专注于探讨Linux也使得本书能够深入探讨Linux最前沿的,并且在未来很长时间依然举足轻重的接口。本书阐述了Linux的相关知识,一些组件如gcc和内核的实现和行为,从专业角度洞察Linux的最佳实践和优化技巧。

相关文章
|
20天前
|
算法 Linux C++
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
29 0
|
20天前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
196 0
|
20天前
|
Linux API C语言
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
28 0
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
|
26天前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
26 1
|
26天前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
29 1
|
20天前
|
存储 算法 Linux
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
37 0
|
20天前
|
存储 算法 Linux
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
34 0
|
14天前
|
传感器 Linux API
嵌入式Linux串口编程简介
嵌入式Linux串口编程简介
13 1
|
14天前
|
Linux 测试技术 C语言
【Linux】应用编程之C语言文件操作
【Linux】应用编程之C语言文件操作
|
20天前
|
算法 Linux API
【Linux系统编程】一文了解 Linux目录的创建和删除API 创建、删除与读取
【Linux系统编程】一文了解 Linux目录的创建和删除API 创建、删除与读取
28 0
【Linux系统编程】一文了解 Linux目录的创建和删除API 创建、删除与读取