附录 E 进一步信息 (Further Sources of Information)
核心结论
-
Manual pages:man 1 - 8 分类(命令 / 系统调用 / 库 / 设备 / 文件格式 / 游戏 / 概述 / 系统管理);man -k 关键字搜索。
-
GNU info 文档:GNU 项目偏爱 info 文档(带超链接);
info info看用法;与 man 互补。 -
GNU C Library manual:描述 glibc 大部分 API;
info libc。 -
Stevens 经典书目:APUE(UNIX 系统编程)、UNP(UNIX 网络编程,两卷);仍是 POSIX / SYSV / BSD 系统编程权威。
-
kernel.org:Linux 内核源码、邮件列表、文档;
http://www.kernel.org/、/usr/src/linux看内核源码。 -
TLPI 延伸阅读:TLPI 著作本身只是入门;进阶需阅读内核源码、glibc 源码、邮件列表(如 LKML)、新闻组(如 comp.unix.programmer)。
|
附录主旨
本附录是 TLPI 全书的"接下来读什么"导引。读者应了解:(1) man/info 文档使用技巧;(2) 主要参考书目(Stevens 系列、Butenhof、Love 等);(3) 社区资源(LKML、newsgroup、kernelnewbies、TLDP、GNU 项目);(4) 直接读 kernel source 的入口与子目录。本附录旨在为继续深入 Linux 系统编程提供地图。 |
一、核心概念
本附录围绕 5 个核心概念:manual pages、GNU info、glibc manual、参考书目、在线资源。
| 概念 | 定义 + 重要性 | 实现提示 |
|---|---|---|
manual pages (man 1-8) |
Linux 标配文档系统;按 section 分类;man -k 搜索;man 2/3 详细 syscalls / library API 含 SYNOPSIS / RETURN VALUE / ERRORS。 |
|
GNU info 文档 |
GNU 项目使用 info 系统; |
|
glibc manual |
glibc 自带 — POSIX / libc / Linux 扩展的 reference; |
内置 |
Stevens 系列书目 |
APUE / UNP 是 POSIX/UNIX 系统编程圣经;其他学者延续(Butenhof Pthreads、Love Linux Kernel Development、Bovet Understanding Linux Kernel)。 |
关键书目见 §E.3。 |
TLPI 之外的社区资源 |
LKML(kernel mail list)、comp.unix.programmer newsgroup、TLDP(HOWTO/FAQ)、kernelnewbies、LWN.net、kernel.org、glibc 源码。 |
见 §E.5。 |
二、详细笔记
E.1 Manual Pages 分类与使用
What:man pages 按 section 分类:
| Section | 内容 | 示例 |
|---|---|---|
1 |
用户命令 |
ls, grep, ssh |
2 |
系统调用 |
open, fork, socket |
3 |
库函数 |
printf, qsort |
4 |
特殊文件 |
null, random, tty |
5 |
文件格式 |
passwd, fstab, termcap |
6 |
游戏 (rare) |
— |
7 |
杂项概述 |
tcp, socket, man-pages |
8 |
系统管理命令 |
mount, iptables, fdisk |
Why:(1) 命令与同名系统调用区别(chmod(1) 命令 vs chmod(2) 系统调用);(2) 标准 reference 一处全含;SYNOPSIS + RETURN VALUE + ERRORS 提供完整 API 信息。
How:
man 2 open # 查 open 系统调用
man 3 printf # 查 printf 库函数
man -k socket # 列出标题含 socket 的所有 man
man -f socket # 列同 socket 名的 man
apropos socket # = man -k
man page 结构(标准): . NAME — 一行简介 . SYNOPSIS — C 原型 + header . DESCRIPTION — 功能 . RETURN VALUE — 返回值 . ERRORS — errno 值 . CONFORMING TO — POSIX / Linux / BSD 标注 . NOTES — 注意事项 . SEE ALSO — 相关 man
When:(1) 任何 API 用法前查 man;(2) man 5 看 /etc/* 格式;(3) man 7 看内核/协议概述。
Example:man 7 socket 给 socket 全集概述(domain / type / protocol / optname 等);man 2 socket 给 single syscall。
E.2 GNU Info 与 glibc Manual
What:GNU info 是 GNU 项目的可浏览超链接文档系统;通过 info 命令浏览;emacs 默认集成。
Why:(1) glibc manual 大内容用 info 比 man 更结构化;(2) GNU 项目偏爱 info。
How:
info # 看 info 顶层
info info # info 使用说明
info libc # glibc 手册根
info libc "Standard Signals" # 章节跳转
info -k printf # 搜索 printf
info libc 章节大纲:
. Main Menu
. The Basic Program/System Interface
. C Library Facilities
. POSIX 1003.1 Facilities
. GNU Extensions
. Library Maintenance
. Contributors
When:(1) 写 portable 程序查 POSIX conformance;(2) 想了解 Linux 特有扩展;(3) 阅读 glibc 源码前后。
Example:info libc "Streams and I/O on File Descriptors" 看 stdio 内部;info libc "Process Creation" 看 fork/exec。
E.3 推荐书目
What:TLPI 列出的关键书目(Stevens 系列为主):
| 书名 | 作者 / 年代 | 重点 |
|---|---|---|
Advanced Programming in the UNIX Environment |
Stevens (1992) / Stevens & Rago (2005) |
系统编程大全;POSIX / SYSV / BSD 合并视角 |
UNIX Network Programming Vol.1, Vol.2 |
Stevens (1998) / Stevens et al. (2004) |
网络编程;Fenner & Rudoff 修订版覆盖 IPv6 / SCTP / 线程 |
Programming with POSIX Threads |
Butenhof (1996) |
pthread API 完整 reference |
Linux Kernel Development |
Love (2010) |
介绍内核代码结构、关键子系统、调试方法 |
Understanding the Linux Kernel |
Bovet & Cesati (2005) |
内核源码详解;VFS / 调度 / 内存 / 中断 / 同步 | |
Linux Device Drivers |
Corbet et al. (2005) |
设备驱动编写标准参考 | |
Operating Systems: Design and Implementation |
Tanenbaum & Woodhull (2006) |
通过 MINIX 讲 OS 实现 | |
UNIX Internals: The New Frontiers |
Vahalia (1996) |
现代 UNIX 内核调查 | |
The Design of the UNIX Operating System |
Bach (1986) |
经典 UNIX System V 内核设计 | |
Linux and the Unix Philosophy |
Gancarz (2003) |
LINUX/UNIX 设计哲学入门 | |
Advanced UNIX Programming |
Rochkind (1985/2004) |
简明 UNIX 编程入门 | |
Why:TLPI 自己只是入门;要写生产级或深入系统,需要这些更深度的参考。
How:阅读顺序: . 先 APUE / TLPI 入门; . 按需看 Butenhof(线程)、UNP(网络); . 进阶看 Bovet / Love 学习内核; . 设备驱动看 Corbet。
When:(1) 想系统学某一专题;(2) 研究某个内核子系统;(3) 准备 Linux Foundation / Kernel 贡献。
Example:APUE (TLPI 等价) 是基础,但 UNP Vol.1 第 30 章更深入讨论 server pool 模型。
E.4 重要新闻组与邮件列表
What:(1) Usenet newsgroup;(2) LKML 邮件列表;(3) TLDP / LWN / kernelnewbies 等网站。
Why:(1) 现役开发者答复专业问题;(2) LKML 看内核开发进行时;(3) 网站文章深入特定主题。
How:
| 资源 | 主题 | 入口 |
|---|---|---|
comp.unix.programmer |
UNIX 通用编程 |
news.example.com |
comp.os.linux.development.apps |
Linux 应用开发 |
同上 |
comp.os.linux.development.system |
内核 / 模块 / 驱动 |
同上 |
comp.programming.threads |
POSIX 线程 |
同上 |
comp.protocols.tcp-ip |
TCP/IP 协议 |
同上 |
LKML 主列表 |
majordomo 注册 |
|
Linux 新人 |
— |
|
网络子系统 |
||
— |
||
文件系统 |
— |
|
内存子系统 |
— |
When:(1) 问具体 bug / API 行为;(2) 看 RFC/bug 讨论;(3) 找 patch 如何 merge。
Example:http://www.faqs.org/ 找 FAQ;http://groups.google.com/ 搜 archived posts。
E.5 在线资源
What:常访问站点:
| 站点 | 内容 | URL |
|---|---|---|
kernel.org |
内核源码、归档、文档 |
|
LWN.net |
深度新闻 + 每周内核总结 |
|
kernelnewbies |
内核新手入门 + 文档 |
|
Linux Cross-Reference |
lxr 浏览内核源 |
|
glibc 源码 |
GNU C 库实现 |
git://sourceware.org/git/glibc.git |
strace / ltrace 源码 |
调试工具实现 |
github.com/strace/strace |
TLDP |
Linux 文档(HOWTO、FAQ) |
|
GNU Project |
软件源码 + 文档 |
|
Linux man pages 归档 |
在线 man pages |
|
Stack Overflow |
一般编程问答 |
stackoverflow.com |
LKML archive |
Why:(1) 在线搜索是低门槛查知识的方法;(2) 部分源码细节只能查 git history。
How:(1) 站内搜索 + GitHub;(2) git clone 内核或 glibc 直接在本地浏览;(3) cip,两者结合。
When:(1) 任何 API 不明确 → 看 man 2 API + 查 SO;(2) 内核细节 → lxr;(3) debug glibc 内部 → git clone glibc 并 grep。
Example:git clone git://sourceware.org/git/glibc.git;cd glibc;grep -r 'PATH_MAX' 查实际定义。
E.6 内核源码子目录速查
What:Linux 内核源码根目录结构(TLPI 表 E-1):
| 子目录 | 内容 | 关注系统 |
|---|---|---|
Documentation |
内核文档(过时但有用) |
各类子系统 |
arch |
架构特定代码 |
x86、arm、arm64、riscv |
drivers |
设备驱动 |
|
network、block、char |
fs |
|
文件系统 |
ext4、btrfs、proc、sysfs、devpts |
|
include |
头文件 |
linux/、uapi/ |
init |
内核初始化 |
|
main.c |
ipc |
|
SysV IPC + POSIX mq |
sem、shm、msg |
|
kernel |
进程 / 调度 / 信号 / time |
sched、time、signal、ptrace |
lib |
通用库 |
|
vsprintf、rbtree、idr |
mm |
|
内存管理 |
page_alloc、slab、vmalloc |
|
net |
网络栈 |
ipv4、ipv6、unix (domain)、tcp、udp | |
scripts |
编译辅助 |
kconfig、checkpatch |
security |
Linux Security Modules |
|
selinux、apparmor、smack |
sound |
|
ALSA 音频子系统 |
— |
|
tools |
perf / bpftool / trace-cmd |
perf |
virt |
KVM |
Why:(1) 出现问题时可定位代码;(2) 阅读子系统时知道在哪个目录。
How:
ls /usr/src/linux/fs # 文件系统子目录
ls /usr/src/linux/net # 网络栈
ls /usr/src/linux/mm # 内存管理
When:(1) 查系统调用实际实现;(2) 找子系统 owner / 维护者;(3) 加 patch 知道改哪里。
Example:net/ipv4/tcp.c 是 TCP 实现;fs/exec.c 是 execve;mm/mmap.c 是 mmap。
三、关键图表
|
信息源速查表
|
|
关键书目按主题
|
四、思维导图
mindmap
root((附录 E 信息源))
man pages
section 1 8
man k f
SYNOPSIS RETURN
ERRORS
info 文档
info libc
info 命令
超链接
glibc manual
info libc
online gnu org
内部实现
推荐书目
APUE Stevens
UNP 两卷
Butenhof Pthread
Love LKD
Bovet ULI
LDD3
Bach UNIX Design
新闻组
comp unix programmer
comp linux dev
comp threads
comp tcp ip
邮件列表
LKML linux kernel
linux newbie
linux net fsdevel
mm kvack
在线资源
kernel org
lwn net
lxr linux no
tldp
gnu org
stack overflow
LKML archive
五、重点与易错点
-
man 区域分类记住 1-8——尤其区分 chmod(1) 与 chmod(2);libc 与 syscall 可能在 section 2 或 section 3。
-
man -k 与 -f——
-k在 one-line summary 中搜;-f(同whatis)列完整 match。 -
man 7 是 overview 章节——tcp(7)、socket(7)、unix(7)、ip(7) 等都是想了解子系统时的起点。
-
GNU info 不是 man 替代品——glibc 信息比 man 详细;但写代码 man 翻查更快。
-
Stevens 系列是基础阅读——APUE 与 TLPI 互补;UNP 第 30 章深入 server pool 设计。
-
LDD3 是驱动开发圣杯——但过时了;Linux 5.x+ 推荐配合内核 Documentation 文档。
-
glibc 源码是 reference——API 行为不在 man 时,glibc/git 是 truth source;安装
git clone git://sourceware.org/git/glibc.git。 -
内核源码是系统调用的最终 reference——man 2 + lxr + 实际源码对照。
-
LKML 邮件列表订阅仅用于内核开发——不是普通系统编程问题的去处。
-
TLDP 过时但基础文档齐全——HOWTO 系列较老;HOWTO 系列仍可读,但 Linux 5.x 后需配合其它站点。
-
LWN.net 需订阅——免费阅读 part,深度需会员;每周 kernel summary 是写内核 patch 必读。
-
Stack Overflow 慎用——答案多但常 outdated;用 man/glibc source 验证。
-
info 与 man 区别——info 文件可以嵌套跳转;man 只能顺序翻页或全文搜。
-
GitHub / git clone 是新的 reference 模式——很多工具在 github 而非官网(如 strace、tmux 都在 github.com 开源)。
-
学会搜 man——
man 2 read时留意「SEE ALSO」部分会列出 write / pread / recv 等相关。 -
跨章衔接:从 TLPI 第一章起,man 2/3 几乎是每章必备工具;附录 F 习题答案要深入得读 UNP / Pthreads / LDD。