《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的最佳实践和优化技巧。

相关文章
|
1月前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
49 17
|
1月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
60 26
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
138 13
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
6月前
|
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
267 6
|
6月前
|
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
235 3
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
77 1
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
目录