第 1 章 历史与标准 (History and Standards)

      +

      核心结论

      • UNIX 起源:1969 年 Ken Thompson 在贝尔实验室开发第一版 UNIX;1973 年 Dennis Ritchie 设计 C 语言,UNIX 几乎完全用 C 重写,成为最早用高级语言实现的主流操作系统。

      • UNIX 分支:第七版 (1979) 后分裂为 BSD (Berkeley) 与 System V (AT&T) 两大支;BSD 贡献了 TCP/IP 与 sockets API;System V 集成了 BSD 网络特性。

      • GNU 项目:1984 年 Richard Stallman 启动 GNU,目标是用自由软件重建 UNIX;1985 年成立 FSF;GPL 许可证保障软件自由。

      • Linux 内核:1991 年 Linus Torvalds 在赫尔辛基大学发布 Linux 内核;与 GNU 用户态工具组合形成完整的类 UNIX 系统——「GNU/Linux」才是完整称呼。

      • 标准化动机:UNIX 厂商众多(SunOS、AIX、HP-UX、XENIX 等),应用可移植性差;POSIX、SUS、X/Open、LSB 等标准应运而生。

      • Linux 标准:Linux 遵循 POSIX.1-2008 (SUSv4) 的核心;LSB (Linux Standard Base) 进一步定义发行版间的二进制兼容性。

      本章主旨

      本章是全书的导论——理解 UNIX 的演化、GNU/Linux 的诞生、标准化进程。Linux 是 UNIX 家族成员之一,但又是 GNU 项目与 Linux 内核的组合。掌握历史脉络有助于理解「为什么 Linux 系统调用长得像这样」「为什么 SUSv3/v4 标准如此重要」以及「为什么 LSB 解决了发行版兼容性问题」。

      一、核心概念

      本章围绕 6 个核心概念展开:从 UNIX 起源到 GNU/Linux 形成,再到标准化进程。

      概念 定义 + 重要性 实现提示

      UNIX 起源

      1969 年 Thompson 在 PDP-7 上写第一版 UNIX;1973 年用 C 重写成为第一个高级语言实现的主流 OS。

      §1.1;C 与 UNIX 共同演化,互相塑造。

      UNIX 分支 (BSD vs System V)

      1979 年后 UNIX 分裂为 BSD (Berkeley) 与 System V (AT&T) 两大支;两者 API 各有差异。

      §1.1;sockets API 来自 BSD;SysV IPC 来自 System V。

      GNU 项目与 GPL

      Stallman 1984 启动 GNU;1985 成立 FSF;GPL 许可证保障软件自由(copyleft)。

      §1.2.1;GCC、glibc、Bash、coreutils 都是 GNU 项目产物。

      Linux 内核

      1991 年 Linus Torvalds 在赫尔辛基大学发布;GPL v2 许可证;与 GNU 工具组合形成完整 OS。

      §1.2.2;与 GNU 用户态的组合 = 完整的类 UNIX 系统。

      POSIX 与 SUS 标准

      POSIX.1 (IEEE) 定义 API;SUS (X/Open) 合并 POSIX + 扩展;SUSv3 (2001) → SUSv4 (2008)。

      §1.3;本书主要参考 SUSv4;sysconf/pathconf 查询实现支持的选项。

      LSB (Linux Standard Base)

      在 POSIX/SUS 基础上进一步统一 Linux 发行版的二进制接口与文件层次。

      §1.3.8;保证商业软件能在不同发行版运行。

      二、详细笔记

      2.1 UNIX 与 C 语言的共同演化

      What:UNIX 是 1969 年由贝尔实验室开发的操作系统;C 是为重写 UNIX 而设计的语言;两者共同塑造。

      Why:理解 UNIX 的设计哲学(「小而美、组合工具、文本流」)和 C 的哲学(「贴近硬件、可移植、程序员友好」),能帮助理解 Linux 系统调用的设计选择。

      How:UNIX 关键时间线(§1.1):

      1. 1969:Ken Thompson 在 PDP-7 写第一版 UNIX;名字是对 MULTICS 的双关。

      2. 1970:重写为 PDP-11 汇编版。

      3. 1973:Dennis Ritchie 的 C 成熟,UNIX 内核几乎完全用 C 重写——成为最早用高级语言写的主流 OS(便于移植)。

      4. 1971-1975:第一至第六版 UNIX;第六版开始在大学分发。

      5. 1977-1979:Thompson 在 UC Berkeley 教学,BSD 诞生。

      6. 1983:4.2BSD 包含完整 TCP/IP + sockets API;SunOS 基于 BSD。

      7. 1983:AT&T 因反垄断被拆分,开始商业化 UNIX;System V 系列诞生;SVR4 (1989) 集成了 BSD 网络特性。

      8. 1984:Richard Stallman 启动 GNU 项目。

      9. 1991:Linus Torvalds 发布 Linux 内核(GPL v2)。

      10. 1992-至今:GNU 用户态工具 + Linux 内核 = 完整的自由 UNIX 系统。

      When:理解「为什么 Linux 系统调用长得像这样」——它是 UNIX 哲学 + C 语言哲学的产物。

      Example:Linux 的 read/write/open/fork 系统调用与 1970 年代的 UNIX 几乎一致——这是 ABI 稳定性的体现。

      2.2 BSD vs System V

      What:UNIX 在 1979 年后分裂为 BSD 和 System V 两大分支;各自的 API 风格有差异。

      Why:Linux 同时支持两套 API(BSD sockets + SysV IPC),应用程序员需要知道「这是 BSD 风格还是 SysV 风格」。

      How:核心差异:

      特性 BSD System V

      Sockets API

      ✓ 1983 年 BSD 4.2 引入

      较晚引入

      IPC(消息队列、信号量、共享内存)

      无原生支持

      SysV IPC

      终端 API

      termios

      termio(旧)

      进程创建

      fork/vfork

      同 BSD

      信号

      sigaction(POSIX)

      同 BSD

      调度

      4.4BSD 引入优先级调度

      SysV 引入 nice

      When:使用 IPC 时——管道/FIFO 用 POSIX;消息队列/信号量/共享内存可选 POSIX(mq_open/sem_open/shm_open)或 SysV(msgget/semget/shmget),两者 API 风格差异显著。

      Example:第 44 章管道(POSIX) vs 第 46-48 章 SysV 消息队列/信号量/共享内存——本书并行介绍两套机制,让读者理解历史脉络。

      2.3 GNU 项目与自由软件

      What:1984 年 Richard Stallman 启动 GNU(GNU’s Not UNIX)项目,目标是构建一个完整的自由 UNIX 系统;1985 年成立 FSF(Free Software Foundation);GPL(GNU General Public License)是其法律基础。

      Why:GNU 项目是 Linux 生态的支柱——GCC、glibc、Bash、coreutils、Make、GDB、Emacs 等核心工具都来自 GNU。没有 GNU,Linux 只是一个内核,不是完整的 OS。

      How:GNU 四项基本自由(FSF 定义):

      1. 自由 0:为任何目的运行程序的自由。

      2. 自由 1:研究程序如何工作并改写以满足需要的自由(源代码访问是前提)。

      3. 自由 2:重新分发副本的自由。

      4. 自由 3:改进程序并向公众发布的自由,使整个社区受益。

      GPL 通过 copyleft 机制保障这些自由:派生作品必须同样以 GPL 发布。

      When:选择开源许可证时——GPL 强 copyleft(传染性);LGPL(库)、MIT、BSD 是更宽松的许可证。

      Example:GCC 编译器是 GPL;Linux 内核是 GPL v2;libc 是 LGPL;许多 BSD 工具是 BSD 许可证。

      2.4 Linux 内核的诞生

      What:1991 年 8 月,芬兰赫尔辛基大学的 Linus Torvalds 在 Usenet 公告 Linux 内核(最初用于运行 GCC);GPL v2 许可证。

      Why:Linux 是 GNU 项目的最后一块拼图——之前 GNU 用户态工具齐备但缺一个自由的内核(Hurd 项目迟迟未成熟)。

      How:Linux 关键节点:

      1. 1991.08:Linus 在 comp.os.minix 公告 v0.01。

      2. 1992:采用 GPL v2(最初只计划给 Minix 用户学习用,改为 GPL 后引发更多贡献)。

      3. 1994:v1.0 发布;网络栈加入。

      4. 1996:v2.0 支持多架构(Sparc、Alpha)。

      5. 2003:v2.6 采用新的版本号方案,引入 CFS 调度器、Inotify、epoll 等。

      6. 2011:v3.0 版本号方案;之后每 ~2-3 个月一个版本。

      7. 至今:由 Linux 基金会协调;数千贡献者;几乎所有超级计算机、Android、云计算都运行 Linux。

      When:理解 Linux 内核版本——uname -r 显示如 5.15.0-78-generic;主版本号变更代表 ABI 不兼容(罕见);次版本号偶数为稳定、奇数为开发。

      Examplecat /proc/versionuname -a 查看当前内核版本和构建信息。

      2.5 POSIX、SUS 与 Linux 标准

      What:POSIX(Portable Operating System Interface for Unix)是 IEEE 制定的一系列标准;SUS(Single UNIX Specification)由 The Open Group 维护,合并 POSIX + X/Open 扩展。

      Why:标准让应用程序「一次编写,到处运行」;Linux 努力遵循 POSIX.1-2008 + SUSv4,是「类 UNIX」而非「UNIX」商标的原因。

      How:UNIX 标准时间线(§1.3):

      1. 1980s:BSD 与 SysV 互不兼容——业界需要标准。

      2. 1988:IEEE 启动 POSIX 工作组;最初是 IEEE Std 1003.1-1988(POSIX.1)。

      3. 1990:X/Open 公司出版《X/Open Portability Guide》。

      4. 1992:POSIX.1-1990;后来扩展为 POSIX.1a/c(实时)。

      5. 1995/96:X/Open 与 OSF 合并;推出 SPEC 1170(1170 个 UNIX API 集合)。

      6. 2001:POSIX.1-2001 + X/Open 合并为 SUSv3。

      7. 2008:POSIX.1-2008 + SUSv4。

      8. 2017+:POSIX.1-2017 进一步整合与修订。

      Linux 标准:

      1. POSIX.1-2008:Linux 内核基本遵循(详见 sysconf/pathconf)。

      2. LSB (Linux Standard Base):在 POSIX 之上进一步定义 Linux 发行版的二进制 ABI + 文件系统层次标准(FHS);商业软件可基于 LSB 编译并在任何兼容发行版运行。

      3. FHS (Filesystem Hierarchy Standard):定义 /bin /etc /var 等目录的标准用途。

      When:写可移植 UNIX 程序——使用 POSIX.1 定义的 API;查询实现支持的能力用 sysconf/pathconf/fpathconf

      Example

      // 查询系统支持的最大进程数(POSIX 标准化查询)
      long n = sysconf(_SC_CHILD_MAX);
      if (n == -1) {
          /* _SC_CHILD_MAX 未定义或错误 */
      } else {
          printf("Max child processes: %ld\n", n);
      }

      2.6 Linux 作为 UNIX 系统

      What:「UNIX」一词有两种含义:(1) 通过 Open Group 认证的商标 UNIX;(2) 看起来像经典 UNIX(Bell Labs、System V、BSD)的系统。Linux 属于第二种。

      Why:理解「Linux 不是 UNIX,但遵循 UNIX 哲学」——这解释了为什么 Linux 系统调用与 POSIX/SUS 标准高度一致。

      How:Linux 与经典 UNIX 的差异:

      1. 许可证:Linux 是 GPL v2(自由软件);经典 UNIX 多是商业软件。

      2. 代码来源:Linux 是从头写的新实现(参考 POSIX/SUS 与 MINIX),不是任何 UNIX 版本的衍生品。

      3. 厂商:Linux 由社区开发(Linux 基金会协调);经典 UNIX 由单一厂商控制。

      4. 标准化:Linux 努力遵循 POSIX.1-2008 + LSB,但内核本身持续演进(新系统调用不断加入)。

      5. GNU/Linux:严格说,完整的「GNU/Linux 系统」= GNU 用户态工具(glibc、coreutils、Bash)+ Linux 内核。

      When:写商业 UNIX 程序迁移到 Linux——大部分 POSIX/SUS API 都可用;少量商业 UNIX 扩展(如 Solaris Zones、AIX WPAR)需要 Linux 替代方案(容器/cgroups)。

      Exampleman 2 syscalls 查看 Linux 支持的所有系统调用;与 man 3 库函数区分。

      三、关键图表

      非可视化条目(表 / 工具)
      时间线 / 工具 描述

      1969-1979

      UNIX 起源与早期版本(PDP-7 → PDP-11 → C 重写)

      1979

      UNIX 分裂为 BSD 与 System V

      1983

      4.2BSD 包含 TCP/IP + sockets

      1984

      GNU 项目启动

      1985

      FSF 成立

      1988

      POSIX 工作组启动

      1991

      Linux 内核发布

      2001

      SUSv3 (POSIX.1-2001)

      2008

      SUSv4 (POSIX.1-2008)

      核心标准对照表
      标准 内容 / 作用

      POSIX.1 (IEEE 1003.1)

      系统 API(文件、进程、信号、线程、IPC)

      SUSv3 (2001)

      POSIX.1-2001 + X/Open 扩展

      SUSv4 (2008)

      POSIX.1-2008 + 进一步扩展

      LSB

      Linux 发行版二进制兼容性

      FHS

      文件系统层次标准(/bin /etc /var 等)

      四、思维导图

      mindmap
        root((第 1 章 历史与标准))
          UNIX 起源
            Thompson 1969
            C 重写 1973
            第七版 1979
          分支演化
            BSD Berkeley
            System V AT&T
            POSIX 工作组
          GNU 项目
            Stallman 1984
            FSF 1985
            GPL copyleft
            GCC glibc Bash
          Linux 内核
            Torvalds 1991
            GPL v2
            多架构支持
          标准体系
            POSIX.1
            SUSv3 SUSv4
            LSB
            FHS
          Linux 地位
            类UNIX非UNIX
            GNU + Linux
            LSB 发行版兼容

      五、重点与易错点

      1. 「Linux 不是 UNIX」但「Linux 是类 UNIX 系统」——这是商标 vs 实质的区分;SUSv4 商标 UNIX 与 Linux 是不同的概念。

      2. GNU/Linux 才是完整称呼——Linux 只是内核;完整的 OS 包括 GNU 用户态工具(glibc、coreutils、Bash、GCC)。

      3. GPL 与 BSD 许可证的区别:GPL 强 copyleft(派生作品必须 GPL);BSD/MIT 宽松(可商用闭源);Linux 内核是 GPL v2,BSD 用户态工具是 BSD 许可证。

      4. POSIX.1-2008 = SUSv4——两者本质同一套标准,由 IEEE 与 The Open Group 共同维护;不同组织出版,但内容基本一致。

      5. BSD sockets vs SysV IPC:BSD 1983 引入 sockets API;SysV IPC(消息队列、信号量、共享内存)由 AT&T 在 System V 中引入;Linux 同时支持两套。

      6. Linux 内核版本号uname -r 输出如 5.15.0;主版本变更罕见;偶数次版本为稳定版(如 2.6、4.19、5.15);CFS 调度器自 2.6.23。

      7. 「UNIX 时间线」关键年份:1969 起源 / 1973 C 重写 / 1979 BSD+SVR 分裂 / 1983 TCP/IP / 1984 GNU / 1988 POSIX / 1991 Linux / 2001 SUSv3 / 2008 SUSv4。

      8. 本书主要参考 SUSv4——大多数代码示例符合 SUSv4;少量 Linux 特有扩展会显式标注。

      9. LSB 的目标:让商业 Linux 软件「一次编译,到处运行」;LSB 5.0 (2015) 是较新版本;LSB 工作组在 2020 年代活动较少。

      10. 跨章衔接:第 2 章基本概念 → 解释 UNIX/Linux 的核心抽象(文件、进程、内存、IPC、信号、线程);第 3 章系统编程概念 → 介绍系统调用与库函数的区别、错误处理约定。