找回密码
 立即注册
首页 业界区 安全 Linux系统编程1核心概念1.4 Unix历史与标准 1.5 C 标准 ...

Linux系统编程1核心概念1.4 Unix历史与标准 1.5 C 标准

蔡如风 9 小时前
1.4 Unix 历史与标准

Unix 复杂而杂乱的历史导致它缺乏单一标准,因此需要仔细阅读文档才能确定您的代码是否可移植,甚至能否在您自己的系统上运行。了解 Unix 的历史,您会发现某些特性源自不同的 Unix 发行版,有时甚至互不兼容,而有些特性则融合了 Unix 家族不同分支的思想。
1.png

1.4.1 UNIX 的诞生

Ken Thompson 于 1969 年在 AT&T 贝尔实验室工作期间,用汇编语言编写了 UNIX 的第一个版本。他还修改了一种名为 B 的旧编程语言,使该系统拥有一个编译器来构建可在新系统上运行的程序。到 1970 年,Dennis Ritchie 开始与 Thompson 合作开发他的系统。从1971年到1973年,他致力于开发一种新的语言——C语言(基于B语言),以促进Unix的开发。
1973年,几乎所有的UNIX内核都用C语言重写。这使得UNIX可以移植到任何配备C编译器的机器上。这是操作系统首次实现可移植性,也是为什么现代Unix如此多地基于C语言的原因。1974年,他们在IBM约克镇高地举行的ACM操作系统研讨会上发表了一篇开创性的论文,阐述了他们的想法,这篇论文使得人们对这款新操作系统的认知度迅速提升。
与此同时,贝尔实验室继续进行UNIX的开发工作,其在实验室内的受欢迎程度也随之增长。在早期,贝尔实验室将UNIX系统称为“研究系统”,每个新版本都称为一个版本,其编号与同时发布的《UNIX程序员手册》(UNIX Programmer’s Manual)的编号相对应。这些版本被命名为 V1、V2 等等。1974 年,AT&T 开始向大学授权 UNIX。由于政府的限制,AT&T 无法出售 UNIX。
1.4.2 早期分支

加州大学伯克利分校 (UCB The University of California at Berkeley) 是从 AT&T 获得 V4 版本的大学之一,并着手为该操作系统添加更多功能,从而开启了其开发的新篇章。1975 年和 1976 年,肯·汤普森 (Ken Thompson) 访问 UCB 时,他和那里的学生为他们的 Unix 版本添加了更多功能。
从 1974 年到 1979 年,UCB 和 AT&T 分别开发了 Unix 的独立版本。到 1978 年,Unix 的各个版本已经具备了如今 Unix 的大部分功能,但并非全部集成在一个系统中。 20世纪70年代末,美国反垄断法开始对AT&T提起诉讼,试图拆分该公司。结果,到1982年,拆分完成后,AT&T被允许销售其自有品牌的UNIX系统。AT&T随后将UNIX的专有权抵押给AT&T,并将其商业化销售。AT&T的第一个主流商用Unix系统名为System V,发布于1983年。在伯克利伯克利分校(UCB)开发的Unix版本被称为伯克利软件发行版(BSD),并有诸如1BSD、2BSD等等名称。BSD系统的许可证比AT&T的许可证更为宽松,而且不需要支付许可费,也不需要与源代码一起分发。结果,大量BSD源代码被整合到各种商业Unix变体中。到4.3BSD编写完成时,几乎没有任何原始的AT&T源代码被保留了下来。 FreeBSD、NetBSD 和 OpenBSD 都是 4.3BSD 的分支,它们没有 AT&T 的原始源代码,也没有 UNIX 商标权,但它们的许多代码也进入了商业 Unix 操作系统。简而言之,UNIX 出现了两个主要版本:基于 BSD 家族的版本和基于 AT&T 版本的版本。
1.4.3 自由软件基金会和 GNU

1983 年,另一件事改变了计算的面貌。曾在麻省理工学院 (MIT) 人工智能实验室工作的 Richard Stallman 发表了《GNU 宣言》。他当时非常激进的理念是软件应该是自由的:不是免费,而是真正自由的自由。他创立了自由软件基金会 (FSF),旨在倡导和推广源代码始终开放和自由的软件,以及与其使用相关的其他自由。他还在FS的支持下启动了GNU项目F.(GNU 是“GNU 不是 Unix”的递归缩写。)
GNU 项目的目标是从零开始构建一个免费的替代 Unix 系统。该项目还开发了大量的免费软件工具和库,包括编译器、文本编辑器、调试器等等。尽管该操作系统的内核(称为 Hurd)并未得到广泛使用,但 GNU 创建的这些工具和库已被世界各地的 Unix 系统采用。
参考资料


  • 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
  • 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
  • python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
  • python八字排盘 https://github.com/china-testing/bazi
  • 联系方式:钉ding或V信: pythontesting
1.4.4 Linux 的崛起

1991 年,一个名为 Linux 的新内核的创建使情况变得更加复杂。Linux 内核是从零开始开发的,这与 BSD 系统不同,这使得 Linux 不像 BSD 那样像 AT&T UNIX。由于 Linux 只是一个内核,没有任何工具或库,因此它与 GNU 项目软件捆绑在一起,使其成为一个功能齐全的操作系统。 Linux 由 Linus Torvalds 发起,当时他是赫尔辛基大学的一名学生。他的许多想法都基于 Minix 操作系统,该操作系统由阿姆斯特丹自由大学的教授 Andrew Tanenbaum 编写。Tanenbaum 在其操作系统著作中提供了 Minix 的源代码。Minix 可以在 Intel 386 处理器上运行,但效率不高。Torvalds 想要构建一个 Unix 内核,使其能够在 Intel 386 处理器上更高效地运行。
1.4.5 众多 Unix 系统

1993 年,AT&T 剥离了 UNIX 系统,将其出售给 Novell,后者一年后又将该商标出售给一个名为 X/Open 的行业联盟。现在有数十个不同的 Unix 发行版,每个都有各自的行为方式。有些系统基于 SVR4(1989 年发布的 AT&T 版本),例如 Solaris 和 UnixWare,以及基于UCB 发行版的 FreeBSD 和 OpenBSD。Linux 等系统是混合体,AIX、IRIX 和 HP-UX 也是如此。
人们很自然地会问,是什么让一个系统成为 Unix。答案是,在过去 30 年左右的时间里,为了定义 Unix,已经制定了一系列标准。操作系统可以被标记为符合某个标准。在下一节中,我们将探讨各种 Unix 标准。
你可以在一些资源中阅读更多关于 Unix 各个方面的历史,例如 Dennis Ritchie 对其历史的讲述 ;Salus 和 Reed 的《守护进程、Gnu 和企鹅》;Salus 在《UNIX 的四分之一世纪》中的全面讲述; Brian Kernighan 的回忆录《Unix:一部历史和一本回忆录》;《UNIX 内部原理》;以及《4.4BSD 操作系统的设计和实现》。您可以在《UNIX 口述历史》中阅读对众多 UNIX 开发人员的访谈记录,并在 https://www.gnu.org/gnu/gnu.html 上阅读 GNU 项目的历史。Torvalds 和 Diamond 发表了一篇关于 Linux 开发的记述 ,《开放源代码:来自开放源代码革命的声音》的附录 A 记录了 Torvalds 和 Tanenbaum 之间与 Linux 内核设计相关的有趣思想交流。
1.4.6 Unix 及相关标准

一个被广泛接受的 Unix 标准是 POSIX 标准,它是可移植操作系统接口 (Portable Operating System Interface) 的缩写。从技术角度来看,POSIX 并没有定义具体的 Unix 系统;它比 Unix 系统更具通用性。POSIX 是一个标准家族,正式名称为 IEEE 1003。它也由国际标准组织 (ISO) 以 ISO/IEC 9945:2003 的名称发布;它们是同一份文件。
截至本文撰写时,POSIX 的最新版本是 IEEE Std 1003.1-2024,也称为 POSIX.1-2024。它同时也被称为开放群组基础规范第8版。POSIX.1-2024 标准整合了其之前的主要标准,包括 POSIX.1 和单一 UNIX 规范第 4 版 (SuSV4)。
POSIX 的精神在于定义一个 Unix 系统,正如该规范的引言 (http://pubs.opengroup.org/onlinepubs/9799919799/) 所述:POSIX.1-2024 定义了一个标准的操作系统接口和环境,包括命令解释器(或“shell”)和常用实用程序,以支持应用程序在源代码级别的可移植性。它旨在供应用程序开发者和系统实现者使用。
单一 UNIX 规范源自 1994 年制定的早期标准 X/Open 系统接口,该标准本身是围绕名为 Spec 1170 Initiative 的 Unix 可移植性指南开发的,该指南描述了规范中涵盖的 1,170 个不同的系统调用、标头、命令和实用程序。
单一 UNIX 规范自 1997 年以来由 The Open Group 进行了多次修订。The Open Group 成立于 1996 年,由 X/Open 和开放软件基金会 (OSF) 合并而成,这两个组织都是行业联盟。The Open Group 拥有 UNIX 商标。它使用单一 UNIX 规范来定义实现必须支持的接口才能调用自身UNIX系统。最新版本于 2018 年修订,包含 1,833 个不同的接口。
该规范标准化了所有系统调用、库以及那些使 Unix 感觉像 Unix 的实用程序(例如 grep、awk 和 sed)的集合。系统调用的集合定义了 Unix 内核。系统调用和库共同构成了 Unix 应用程序编程接口,而实用程序则构成了 Unix 用户界面。
该标准主要包含四个部分:

  • 基础定义:所有标准卷中通用的通用术语、概念和接口,包括实用程序约定和 C 语言头文件定义。
  • 系统接口:系统服务函数和子例程的定义;C 编程语言中特定语言的系统服务;函数问题,包括可移植性、错误处理和错误恢复。
  • Shell 和实用程序:命令解释器和应用程序常用实用程序的标准源代码级接口定义。
  • 基本原理:这是一个信息性章节,包含有关 POSIX.1-2024 内容的历史信息,以及标准开发者为何添加或丢弃某些功能。
POSIX.1-2024 还将以下领域定义为超出其范围:

  • 图形接口
  • 数据库管理系统接口
  • 记录 I/O 注意事项
  • 对象或二进制代码的可移植性
  • 系统配置和资源可用性
POSIX 定义的所有接口均用 C 语言编写,因为 Unix 的大部分功能最初都是用 C 语言开发的。因此,POSIX 依赖于 C 语言的标准定义;具体来说,POSIX.1-2024 基于 C17,其官方标准是 ISO/IEC 9899:2018。我将在下一节中详细讨论 C 标准。
2018 年发布的单一 UNIX 规范第 4 版与 POSIX.1-2024 基本相同,不同之处在于它包含了 ncurses 库的标准。ncurses 库是一个终端控制库,可用于创建在终端窗口中运行的交互式程序,例如文本编辑器和游戏。
存在标准并不意味着所有 Unix 实现都遵循这些标准。虽然有些系统(例如 AIX、Solaris 和 macOS)完全符合 POSIX 标准,但大多数系统只是部分兼容。FreeBSD 和各种版本的 Linux 等系统都属于此类。
任何单一 Unix 系统都可能具有不符合标准的功能和接口。系统编程的挑战在于,尽管如此,我们仍然能够编写出能够在各种系统上运行的程序。
Unix 手册页通常会显示该手册页的主题符合哪些标准。第 7 节中的标准手册页列出了手册页中引用的所有标准的名称。如果您输入命令 man standards,您将看到完整的列表。在第 2 章中,我们将介绍如何使用功能测试宏来提供在各种不同的 Unix 系统上编译单个程序的方法。
1.5 C 标准

自 Dennis Ritchie 首次发明 C 编程语言以来,它经历了多次修订,每次修订都增加了新功能,有时也会修复一些缺陷。截至撰写本文时,最新版本是 C23。您可以从各种网站(例如 https://iso-9899.info/wiki/The_Standard)下载最新的免费 C23 标准草案以及旧版本的草案。建议您在本地保存一份当前标准的副本,以便在程序中遇到不熟悉的结构时使用。
由于 POSIX 不仅规定了 Unix 必须执行的操作,还规定了 C 标准库各个部分必须执行的操作,因此它实际上规定了 C 语言的扩展。因此,符合 POSIX 标准的 Unix 系统包含 C 语言的所有库函数,例如 C 标准 I/O 库和 C 数学库,它们通常被称为 C 标准库。
Linux 以及其他几个 Unix 发行版提供的 C 标准库是 GNU C 库,称为 GNU libc 或 glibc。GNU 经常扩展 C 库,但其中并非所有内容都符合 ISO 标准或 POSIX 标准。所有这些意味着,一个系统上的 C 库版本不一定与另一个系统上的版本相同。
这就是为什么了解标准并了解其定义和未定义的内容非常重要的原因之一。一般来说,C 标准描述了什么是必需的、什么是禁止的以及在一定范围内什么是允许的。具体来说,它描述了以下内容:

  • C 程序的表示
  • C 语言的语法和约束
  • 解释 C 程序的语义规则
  • C 程序处理的输入数据的表示
  • C 程序生成的输出数据的表示
  • 符合 C 语言实现的限制和局限
并非所有编译器和 C 语言运行时库都符合该标准,这使 C 语言编程变得复杂。
GNU 编译器提供命令行选项,可让您根据各种标准进行编译。例如,如果我们希望我们的 hello.c 程序
按照 ANSI 标准进行编译,我们可以输入:$ gcc -ansi hello.c -o hello
由于 C90 与 ANSI 标准相同,我们也可以输入:$ gcc -std=c90 hello.c -o hello
再举一个例子,要按照 ISO C11 标准编译 hello.c,我们可以输入:$ gcc -std=c11 hello.c -o hello
即使有更新的 ISO C 标准,如果我们使用前面的命令,它仍然会应用最新的 C 标准。
了解如何为 Unix 编写程序需要知道哪些特性是 C 语言的一部分,哪些特性是 Unix 的一部分。换句话说,你需要了解 C 库的功能以及底层 Unix 系统的定义。掌握 C 标准将使这一切变得更容易。
1.6 小结

系统程序与大多数初学者学习编写的程序有着根本的不同,因为它们访问的是计算机系统内部受保护的资源。当一个程序执行一个相对简单的打印到终端窗口的调用时,实际发生的事情远比我们肉眼所能看到的要复杂得多。这一系列步骤包括使用系统调用,即对内核代码的函数调用。内核是操作系统的核心,只要计算机处于开启状态,它就驻留在内存中,负责保护、管理和提供计算机系统中的各种资源。Unix 在操作系统设计中引入了许多新颖的理念。
使其如此成功的一些最具创新性的理念如下:

  • 可编程、可互换的命令行解释器,称为shell,它在用户空间运行,而不是作为内核的一部分
  • 进程的概念和进程创建方法
  • 使用两级权限保护内核及其资源
  • 独立于设备的I/O操作
  • 将文件表示为无结构的字节序列
  • I/O重定向和管道
  • 用户、组和文件权限的概念
  • 单一目录层次结构
  • 环境概念
Unix的发展和传播导致了许多不同的Unix变体和发行版的出现,并催生了标准化的需求。这反过来又促成了一个联盟的成立,该联盟为其接口和行为制定了POSIX标准。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册