编程语言研究书库

System Programming in Linux — 全书拆解

System Programming in Linux — 全书拆解

30 秒导读: 这是一本 1051 页、19 章正文 + 3 个附录的 Linux 系统编程教材(2025, No Starch Press),作者 Stewart N. Weiss 是纽约市立大学 Hunter College 计算机系教授 (1987–2025),把他教了几十年的 Unix 系统编程课写成了书。 它的讲法独树一帜:不讲「API 大全」,而是带你逐个仿写 系统命令——date、cp、ls、du、pwd、ps、last、who、 top、shell——每个命令逼出一组系统调用,每章读完你手里 多一个能跑的程序。本拆解按原书 19+3 的章节结构一一对应, 全部出处可回核原书转码文本。

补充(不在书里):作者主页与成书信息见 Hunter College 网站 https://www.cs.hunter.cuny.edu/~sweiss/(查阅于 2026-10-19); 配套源码仓在 GitHub 的 stewartweiss/intro-linux-sys-prog。

1. 这是谁在什么时候写的

作者Stewart N. Weiss,PhD(NYU Courant,1987);Hunter College CUNY 计算机系教授 1987–2025,Unix 系统编程课的开课人
出版No Starch Press,2025 年 9 月;1051 页
时代坐标POSIX.1-2024(= Open Group Base Specs Issue 8)、Linux 6.x 内核、glibc 2.3x 时代的最新教材;引用的内核细节截至约 6.13
利益相关教材性质,无商业利益绑定;配套代码以 GPL/LGPL 发布在 GitHub

两件事必须先说: ① 这是 2025 年的新书——书里所有数字 (POSIX.1-2024、约 450 个系统调用、PIPE_BUF=4096 等)都是 当下的,还没有被时间冲刷;② 它有意不碰网络编程(socket 反复出现又反复声明不讲),IPC 全部用本机机制。

2. 全书一条主线

一条从「一个 printf」到「一台服务器」的推理链,每一步都是 被上一步逼出来的:

① 你写的普通程序,其实一直住在别人家里。 一个 printf 的 字符能到屏幕,靠的是四层人的接力:你的程序 → C 库 → 系统调用 → 内核。系统编程 = 直接敲内核那扇门(第 01 章)。

② 敲门要有规矩:错了怎么办、参数怎么给、凭什么信你。 errno 错误处理、getopt 命令行解析、strtol 数字解析、特性 测试宏——这是之后所有程序的「通用语」(第 02 章)。

③ 先拿一个最 innocuous 的命令开刀。 仿写 date 要 取时间(time/clock_gettime)、拆时间(struct tm)、格式化 (strftime)、说人话(locale/setlocale)——四个版本的迭代 把「man 页驱动的研究流程」整套演示完(第 03 章)。

④ 文件 I/O 的四支柱与性能真相。 open/read/write/close 对一切文件通用——包括终端和打印机。内核替你缓冲,write 成功≠落盘(fsynC)。缓冲区实验告诉你:系统调用贵 28 倍, 4KB 以上边际收益递减(第 04 章)。

⑤ 一个 lseek 带出半边世界。 文件空洞与稀疏文件; lastlog/utmp/wtmp 三个登录记账文件;「显式 seek 读」对 「API 读」两种范式(第 05 章)。

⑥ 把「文件」拆到磁粉上。 磁盘→分区→块组→inode 的 15 级块指针→VFS 的函数指针表——同一个 read() 通吃 ext4 和 U 盘 FAT 的秘密;stat/statx 把元数据全部给你 (出生时间只有 statx 给)(第 06 章)。

⑦ 目录是一棵树(又不完全是)。 树遍历四种做法、挂载 点让 inode 号跨文件系统不唯一、(dev,ino) 对才是文件的 身份;pwd 要逆树攀爬,靠 .. 这条唯一反链(第 07 章)。

⑧ 内核要打断你,就有了信号。 空消息、不排队、CTRL-C 的七步硬件旅程;处置三选一,SIGKILL/SIGSTOP 谁也拦不住; 阻塞≠忽略;sigsuspend 原子等待;sigaction 的四个开关 各管什么(第 08 章)。

⑨ 时间到了该响——定时器。 jiffy 与硬件时钟;相对重睡 累积 drift,绝对睡眠免疫;alarm 一秒粒度,POSIX timer 纳秒 周期;overrun 帮你数丢了几响(第 09 章)。

⑩ 进程是谁:组织、图纸、内存、账本。 进程树/组/会话 三级组织;ELF 的双视图;虚拟内存五段;text 只读共享; task_struct 换程序时哪些保留哪些清除;/proc 是内核的 X 光窗——ps 只是它的读者(第 10 章)。

⑪ 进程的一生:生(fork)、换(exec)、死(exit)、 收(wait)。 fork 复制一切但文件偏移共享;exit(356) 父亲 只收到 100;zombie 与孤儿;SIGCHLD 不排队要兜底; shell 不神秘——while 循环 + fork + execvp + waitpid (第 11 章)。

⑫ 进程要对话:IPC。 共享内存最快但同步归你——共享 内存里不许放指针(各进程映射地址不同!);信号量管秩序 (Dijkstra 的 P/V);消息队列按优先级整封收发(第 12 章)。

⑬ 最古老也最优雅的通道:管道。 字节流、读走即毁、 PIPE_BUF 原子写;「不关端就死等 EOF」是头号坑;dup2 把管道塞进 stdin/stdout——shell 的竖线就这么实现(第 13 章)。

⑭ 把管道升级成服务:守护进程与客户端-服务器。 syslog 是没终端之后的嘴;daemon 七步仪式(fork×2、setsid、 chdir /、umask、关 fd);公共 FIFO + 私有 FIFO 的 请求-应答架构;迭代 vs 并发(第 14 章)。

⑮-⑯ 线程:共享一切,只剩栈。 1:1 模型每线程一个内核 LWP;create/join/detach/cancel 对照 fork/wait;信号 与线程是第 ⑧ 步直觉的坟墓——掩码每线程、处置全进程、 进程定向信号随机落点,正解是专线程 sigwait;然后四件 同步工具:mutex(wait 必须 while 重验——虚假唤醒)、 条件变量、屏障、读写锁(第 15、16 章)。

⑰-⑲ 交互程序的完全体。 等输入不能干等:轮询/信号驱动/ AIO/select 四选;终端 = 设备驱动 + 行纪律,规范模式攒行, termios 改装它;VMIN/VTIME 四组合,字节间定时是 vi 分辨 方向键的原理;最后 ncurses 把手工轮子全部收进库里(第 17–19 章)。

⑳ 附录是工具箱: 亲手造库(soname/ldconfig)、Unicode 与 UTF-8(码位≠字节)、格式符速查(第 20 章)。

3. 章节地图

按原书顺序读即可;每一章的拆解文档名与原书章号对应:

章读完你能
01 核心概念说清内核/系统调用/文件/目录/进程的概念地基,会用 man 页
02 基本功处理 errno、解析命令行(getopt/strtol)、控制可移植性
03 时间与 locale取时/拆时/格式化/国际化;看懂 locale 的 12 个类别
04 文件 I/O 基础open/read/write/close 用熟;缓冲区大小怎么选
05 I/O 进阶与登录记账lseek 与稀疏文件;读懂 utmp/wtmp;仿写 last
06 文件系统从磁盘讲到你手里的 stat 结构;VFS 是什么
07 目录层次遍历目录树;挂载点语义;手写 pwd
08 信号捕获/阻塞/等待信号;handler 设计军规
09 定时器周期回调、绝对睡眠、overrun 计数
10 进程基础看懂 ps/top//proc;ELF 与内存布局
11 进程创建与终止fork/exec/exit/wait 四原语;写自己的 shell
12 IPC 总览共享内存+信号量+消息队列;三信号量生产者-消费者
13 管道与 FIFO管道语义;复刻 shell 竖线;mkfifo
14 客户端-服务器与守护进程daemon 化;迭代/并发服务器架构
15 线程Pthreads 基础;信号与线程的正确姿势
16 线程同步mutex/条件变量/屏障/读写锁
17 I/O 替代方法轮询/信号驱动/AIO/select 的取舍
18 终端termios 改装终端;行纪律与规范模式
19 ncurses非规范模式;MIN/TIME;ncurses 双缓冲
20 附录造库;UTF-8 原理;格式符速查

4. 覆盖什么 / 不覆盖什么

覆盖(全书的核心主张): 以仿写命令为主线的 Unix/Linux 系统调用全景——文件、文件系统、目录、进程、信号、定时器、 IPC 四大件、线程与同步、终端、ncurses、daemon;每个机制 都有可运行的示范程序与对照实验;全部基于 POSIX.1-2024 + Linux 6.x 的当代口径。

不覆盖(别在这本里找):

缺什么说明
网络编程socket 反复声明不讲(第 1 章原话:「能单独写一本书」);所有 IPC 是本机机制
调度策略nice/调度类/实时调度只在 ps 字段里路过
内存映射文件mmap 讲了共享内存用法,mmap 文件 I/O 本体未展开
epoll 深入只在 select 一节点名
systemd 集成daemon 化讲了传统七步,PID 文件/systemd unit 未涉及
安全专题setuid 讲了机制,setuid 编程的攻防没展开

5. 我们的判断

判断(我们的,不是书里的): 这本书在「系统编程教材」 这个品类里是方法论上最独特的一本——别人按 API 分类 讲,它按「仿写一个命令」组织,学习曲线因此多了一层 「自己发现该查什么」的训练,这正是真实工作里系统程序员 的日常。代价是覆盖面让位给了深度:每个主题只挖到「能 写出工作程序」为止。 如果错,会错在: 如果读者的目标是把某个专题(比如 信号或终端)挖到 production 深度,这本只能当第一遍, 得回 man 页和 APUE 补深挖——但书里的 man 页驱动方法 恰好就是那个补给路径的训练。

判断(我们的,不是书里的): 全书最值钱的三处「原书 没有明说但藏在教法里」:①「共享内存里禁止指针,只许 偏移」这条铁律;②多线程信号 = 挡全部 + 专线程 sigwait 的处方;③「缓冲区分叉」(fork 前 fflush)——三处都是 真实事故的高发区,而这本书把它们放在了必经之路上。 如果错,会错在: 这三条在 2025 年的 Linux 上依然成立, 但若未来 ABI 或线程模型大改(如完全用户态调度),处方 的写法要跟着改——机制结论不变,写法会过时。

6. 许诺兑现表

许诺在哪应兑现在哪
本页 §2 ③ date 四版本03 §5(spl_date1-4)
本页 §2 ④ 缓冲区实验04 §8(17 档实测表)
本页 §2 ⑪ shell 不神秘11 §7(spl_sh 60 行)
本页 §2 ⑮-⑯ sigwait 正解15 §3、16 §2
本页 §4 不覆盖网络无对现(如实缺口)

拆解写于 2026-10,依据 2025 年 No Starch 版。原始书籍文件不入库; 每条引用可用 node scripts/book-verify.mjs system-programming-in-linux 回核。

On this page