1. Unix 标准与手册页
-
背景引入
- 在学习进程、线程编程之前,通常接触过文件 I/O。
- 常用函数:
open是一个系统调用(System Call)。 - 在手册页(man page)中查看
open(Section 2)时,会看到系统调用层面的描述。 - 在手册页中查看
open和creat函数时,会看到符合多种标准的标注:- SVR4 (System V Release 4)
- 4.3BSD (Berkeley Software Distribution)
- POSIX (Portable Operating System Interface)
- POSIX.1-2001
- POSIX.1-2008
- 核心问题:为什么手册页要单独列出这些标准?这些标准存在的意义是什么?
-
本节目标
- 理解 Unix 系统的诞生与普及。
- 理解 Unix 的两个重要分支:BSD 和 System V。
- 理解标准化的必要性及主要标准(POSIX, SUS)。
- 理解 Linux 下如何实现这些标准。
2. Unix 系统的诞生与普及
-
诞生历程
- 1969 年:Unix 系统诞生,由 Bell Labs(贝尔实验室)的 Ken Thompson 教授开发,最初使用汇编语言编写。
- 1972 年:Dennis Ritchie 设计实现了 C 语言(基于 B 语言)。
- 1973 年:贝尔实验室使用 C 语言重写了 Unix 系统。
- 意义:后续的 Unix 系统(包括 Linux)主要使用 C 语言编写,提高了可移植性。
- 早期硬件:早期的 Unix 运行在类似工作台的早期计算机上,与现代实现虽有技术传承,但形态区别较大。
-
早期普及与许可
- 所属公司:Bell Labs 隶属于 AT&T 公司。
- 业务特点:AT&T 主营业务不包括操作系统,因此早期 Unix 呈现“免费”(打引号)特点。
- 许可模式:收取象征性费用,发放软件许可(知识产权许可)。
- 高校推广:AT&T 向各大高校发放许可。
- 截至 1977 年,约有 500 个站点使用 Unix。
- 覆盖全美及海外,包括 125 所大学。
- 主要用途:教学目的。
3. Unix 的两大重要分支
随着 Unix 的普及和商业化,出现了众多版本,但主要关联到两个核心版本分支:
-
分支一:BSD (Berkeley Software Distribution)
- 来源:加州大学伯克利分校 (UC Berkeley) 是活跃的许可证获得者之一。
- 贡献:
- 对 Unix 系统做出了重大贡献。
- 套接字 (Sockets):最早由伯克利分校研究生设计实现,用于网络通信。
- Vi 编辑器:最早由伯克利分校研究生实现(新版为 Vim)。
- 商业化演变:随着 Unix 商业化加重,伯克利分校演化出 Berkeley Software Distribution 公司。
- 版本:常见的 BSD 4.2、BSD 4.3 即指该分支的版本。
-
分支二:System V (系统五)
- 背景:美国通过反托拉斯法案,AT&T 被强制拆分。
- 商业化销售:独立后的新 AT&T 公司开始正式销售 Unix 系统,并进行迭代更新。
- 版本发布:
- 1982 年:发布 System III。
- 1983 年:发布 System V (Unix 系统的第五个版本)。
- 重要性:System V 版本应用广泛,对软件行业发展重要。手册页中的 SVR4 即指 System V Release 4(系统五的第 4 个版本)。
4. 标准化的需求与背景
-
问题背景
- 时间点:20 世纪 80 年代末。
- 现状:Unix 已商业化,不同计算机厂商基于 BSD 或 System V(或两者兼容)实现自己的 Unix 系统。
- 碎片化:厂商在基础系统上添加额外的私有特性。
- 后果:软件及技术人员在不同 Unix 系统间转移变得困难(可移植性差)。
- 类比:如同编程语言不统一,阻碍交流与发展。
-
事实标准 (De Facto Standards)
- 在正式标准出台前,存在事实上的标准:
- 基于 BSD 的系统需实现 BSD 相关接口。
- 基于 System V 的系统需实现 System V 相关接口。
- 手册页标注
SVR4、4.3BSD即表示该接口符合相应版本的事实标准,确保兼容性。
- 在正式标准出台前,存在事实上的标准:
-
C 语言标准
- 背景:大家均使用 C 语言,语法基本统一(基于 K&R C 语言书籍),但库函数接口不统一。
- ANSI 标准:美国国家标准委员会组织制定新的 C 语言标准。
- C89:后来所说的标准 C 语言(ANSI C)。
- 后续版本:C99, C17 等。
- 规定内容:
- C 语言的语法和语义。
- C 语言库函数操作。
- 局限性:标准 C 主要规定语言层面和标准库,但文件 I/O(如
open)、进程、线程、网络等 API 属于系统级别,不在标准 C 规定范围内。
5. 系统级标准:POSIX 与 SUS
为解决系统级 API 的标准化问题,出现了以下标准:
-
POSIX 标准 (Portable Operating System Interface)
- 组织:IEEE (电气电子工程师协会)。
- 目标:提升应用程序在源码级别的可移植性。
- 确保 A 系统和 B 系统的 API 行为一致(如
open函数参数、行为)。 - 不规定源码如何实现,只规定函数行为和规范。
- 确保 A 系统和 B 系统的 API 行为一致(如
- 覆盖范围:进程、线程、网络等 API 接口。
-
SUS 规范 (Single UNIX Specification)
- 组织:The Open Group (由多家国际计算机厂商组成的联盟)。
- 背景:Unix 商标版权最终转到 The Open Group 手中。
- 目的:实现操作系统在不同计算机厂商间的运行兼容性。
- 与 POSIX 关系:
- SUS 在 POSIX 标准之上做了更严格的定义。
- Austin Group:IEEE 和 The Open Group 联合组成的工作组,统一了 POSIX 和 SUS 标准。
- 版本对应:
- POSIX.1-2001 取代了 SUSv2 及早期 POSIX 标准。
- 该标准也被称为 SUSv3。
- 结论:POSIX 标准和 SUSv3 本质上是同一个标准,两个名字。
-
手册页中的标准标注意义
- 标注
SVR4:符合 System V 第 4 版标准。 - 标注
4.3BSD:符合 BSD 4.3 版本标准。 - 标注
POSIX/POSIX.1-2001:符合 POSIX 标准(即 SUSv3)。 - 作用:开发者可知该接口的适用性和兼容性范围。
- 标注
-
现状
- POSIX 标准不仅用于 Unix,Windows 系统也声称支持许多 POSIX 标准接口。
- POSIX 已逐渐成为计算机系统的通用标准。
6. Linux 与 GNU 项目
-
开源软件运动背景
- 80-90 年代,商业操作系统(如早期 Unix、Windows)价格贵且源码不开放,阻碍技术发展。
- GNU 计划:由 Richard Stallman 发起。
- 目标:创建完全自由的类 Unix 操作系统(Unix-like)。
- 注意:不能直接拷贝 Unix 源码(侵犯知识产权),需自行实现。
- GNU 贡献:
- 制定 GNU GPL 标准。
- 实现 GNU 编译器 (GCC)。
- 实现 Shell (Bash)。
- 实现 C 库 (glibc):包含 C 标准库函数及 POSIX 标准库函数。
- 缺失:缺少系统内核。
-
Linux 内核
- 开发者:Linus Torvalds。
- 实现:开发了一个操作系统内核(最初未命名为 Linux,后定为 Linux)。
- 结合:Linux 内核 + GNU 工具链 = 完整的 Linux 操作系统。
- 归属:Linux 内核很快归入 GNU 项目,成为其一部分。
-
Linux 与 Unix 的关系
- 继承角度:Linux 源自 Unix 思想(如 Minix 教学系统影响),属于 类 Unix (Unix-like) 系统。
- 版权角度:
- Unix 商标归 The Open Group 所有。
- 符合 SUS 标准并通过认证的系统才能称为官方 Unix 系统(如 macOS 已拿到 Unix 认证)。
- Linux 未通过官方 Unix 认证,因此严格来说 Linux 是 Linux,Unix 是 Unix。
- 语境区别:
- 技术继承上:Linux 属于 Unix 体系。
- 商业版权上:Linux 与 Unix 区分明确。
7. Linux 下标准的实现与查看
-
POSIX 标准在 Linux 下的实现方式
- 系统调用 (System Call):
- 部分 POSIX API 直接由内核实现。
- 例如:
open在 Linux 下是系统调用。
- 库函数 (Library Function):
- 部分 POSIX API 封装在 glibc 库中。
- 例如:某些 POSIX 标准接口作为 C 库函数实现。
- 系统组件:
- Shell:Linux 实现了 POSIX 规定的 Shell(如 Bash)。
- 工具:实现了系统级工具命令(如
grep,report等)。
- 系统调用 (System Call):
-
手册页 (Man Pages) 的使用与区分
- 查看 Linux 实现:
- 命令:
man 2 open - 内容:查看 Section 2,即 系统调用 层面的描述,反映 Linux 具体实现。
- 命令:
- 查看 POSIX 标准:
- 命令:
man 3 open - 内容:查看 Section 3,即 库函数 层面,通常对应 POSIX 标准描述。
- 注意:POSIX 手册页会提醒细节可能与 Linux 具体实现有出入。
- 命令:
- 安装 POSIX 手册页:
- 默认可能未安装 POSIX 标准手册页。
- 安装命令(Ubuntu/Debian 示例):
sudo apt-get update sudo apt-get install man-pages-posix-dev - 安装后可查看符合 POSIX 标准下的接口描述及实现细节。
- 查看 Linux 实现:
-
总结
- 学习 Linux 编程需理解标准(POSIX/SUS)与具体实现(Linux Kernel/glibc)的关系。
- 查阅文档时注意区分是查看系统调用(Section 2)还是库函数/标准描述(Section 3)。
- 本课程重点学习 POSIX 标准中关于进程、线程相关的内容。