附录 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。

      man 2 selectman -k socket;标准 8 个 section 见下表。

      GNU info 文档

      GNU 项目使用 info 系统;info info 看用法;glibc 文档大量用 info;超链接比 man 灵活。

      info libc;emacs 调 M-x info;多数 GNU 工具都有 info 版本。

      glibc manual

      glibc 自带 — POSIX / libc / Linux 扩展的 reference;info libchttp://www.gnu.org/ HTML 版。

      内置 info libc 分章节 Function/Macro/Variable;搜索特定符号。

      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 源码前后。

      Exampleinfo 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 协议

      同上

      linux-kernel@vger.kernel.org

      LKML 主列表

      majordomo 注册

      linux-newbie@vger.kernel.org

      Linux 新人

      linux-net@vger.kernel.org

      网络子系统

      linux-fsdevel@vger.kernel.org

      文件系统

      linux-mm@kvack.org

      内存子系统

      When:(1) 问具体 bug / API 行为;(2) 看 RFC/bug 讨论;(3) 找 patch 如何 merge。

      Examplehttp://www.faqs.org/ 找 FAQ;http://groups.google.com/ 搜 archived posts。

      E.5 在线资源

      What:常访问站点:

      站点 内容 URL

      kernel.org

      内核源码、归档、文档

      http://www.kernel.org/

      LWN.net

      深度新闻 + 每周内核总结

      http://lwn.net/

      kernelnewbies

      内核新手入门 + 文档

      http://kernelnewbies.org/

      Linux Cross-Reference

      lxr 浏览内核源

      http://lxr.linux.no/linux/

      glibc 源码

      GNU C 库实现

      git://sourceware.org/git/glibc.git

      strace / ltrace 源码

      调试工具实现

      github.com/strace/strace

      TLDP

      Linux 文档(HOWTO、FAQ)

      http://tldp.org/

      GNU Project

      软件源码 + 文档

      http://www.gnu.org/

      Linux man pages 归档

      http://www.kernel.org/doc/man-pages/

      在线 man pages

      Stack Overflow

      一般编程问答

      stackoverflow.com

      LKML archive

      https://lkml.org/

      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。

      Examplegit 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 知道改哪里。

      Examplenet/ipv4/tcp.c 是 TCP 实现;fs/exec.c 是 execve;mm/mmap.c 是 mmap。

      三、关键图表

      信息源速查表
      需求 第一站 第二站

      API 用法

      man 2/3 / info libc

      SO / glibc 源码

      内核机制

      man 7 / LWN

      kernel source / lxr

      驱动开发

      LDD3 / 内核源码 drivers/

      kernelnewbies

      网络协议

      UNP + RFC

      RFC editor / IETF

      线程

      Butenhof Pthreads

      glibc nptl/

      案例 / FAQ

      TLDP

      comp.unix.programmer

      实战

      SO + 内核邮件列表

      LKML

      新功能 / changelog

      LWN weekly kernel

      git log

      关键书目按主题
      主题 推荐书 备选

      系统编程

      Stevens APUE (TLPI)

      Rochkind |

      网络

      UNP Vol.1 / Vol.2

      Tanenbaum Computer Networks

      线程

      Butenhof Pthreads

      内核

      Bovet ULI / Love LKD

      Vahalia / Bach

      驱动

      Linux Device Drivers (LDD3)

      — |

      实现

      Tanenbaum Minix

      Bach

      四、思维导图

      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

      五、重点与易错点

      1. man 区域分类记住 1-8——尤其区分 chmod(1) 与 chmod(2);libc 与 syscall 可能在 section 2 或 section 3。

      2. man -k 与 -f——-k 在 one-line summary 中搜;-f(同 whatis)列完整 match。

      3. man 7 是 overview 章节——tcp(7)、socket(7)、unix(7)、ip(7) 等都是想了解子系统时的起点。

      4. GNU info 不是 man 替代品——glibc 信息比 man 详细;但写代码 man 翻查更快。

      5. Stevens 系列是基础阅读——APUE 与 TLPI 互补;UNP 第 30 章深入 server pool 设计。

      6. LDD3 是驱动开发圣杯——但过时了;Linux 5.x+ 推荐配合内核 Documentation 文档。

      7. glibc 源码是 reference——API 行为不在 man 时,glibc/git 是 truth source;安装 git clone git://sourceware.org/git/glibc.git

      8. 内核源码是系统调用的最终 reference——man 2 + lxr + 实际源码对照。

      9. LKML 邮件列表订阅仅用于内核开发——不是普通系统编程问题的去处。

      10. TLDP 过时但基础文档齐全——HOWTO 系列较老;HOWTO 系列仍可读,但 Linux 5.x 后需配合其它站点。

      11. LWN.net 需订阅——免费阅读 part,深度需会员;每周 kernel summary 是写内核 patch 必读。

      12. Stack Overflow 慎用——答案多但常 outdated;用 man/glibc source 验证。

      13. info 与 man 区别——info 文件可以嵌套跳转;man 只能顺序翻页或全文搜。

      14. GitHub / git clone 是新的 reference 模式——很多工具在 github 而非官网(如 strace、tmux 都在 github.com 开源)。

      15. 学会搜 man——man 2 read 时留意「SEE ALSO」部分会列出 write / pread / recv 等相关。

      16. 跨章衔接:从 TLPI 第一章起,man 2/3 几乎是每章必备工具;附录 F 习题答案要深入得读 UNP / Pthreads / LDD。