LINUX系统编程(第2版)
Robert Love
祝洪凯, 李妹芳, 付途 译
出版时间:2014年03月
页数:420
“本书是想要编写优雅的Linux应用或期望提高编程技巧人员的必备书籍。Robert为专业Linux编程人员打下了基础。”
——Jeremy Allison
Samba Team

本书详细阐述了如何编写与Linux内核和核心系统库所提供的服务直接相关的软件。在这本书中,Linux内核贡献者Robert Love全面阐述了Linux系统编程,指导如何进行Linux系统调用,并从专家角度分析如何编写更优雅、运行更快的代码。
本书作者对POSIX标准函数和Linux提供的一些特定服务非常了解。本书第2版新增了一章专门介绍多线程,这是对第1版的更新和扩展,同时本书从理论和应用角度深入分析Linux,涉及的编程主题很广,包括以下精彩内容:
· Linux内核、C库和C编译器概览;
· 基础I/O操作,如文件读写;
· 高级I/O接口、内存映射以及优化技术;
· 关于基本过程管理的系统调用;
· 高级进程管理,包括实时进程;
· 线程概念,多线程编程和Pthreads;
· 文件和目录管理;
· 内存分配和优化内存访问相关的接口;
· 基本的和高级的信号接口,及其在系统中的作用;
· 时钟管理,包括POSIX时钟和高精度计时器。

Robert Love很早就一直使用Linux并贡献代码,对Linux内核和GNOME桌面环境有重大贡献。Robert Love是Google软件工程师,是Android设计和开发团队成员。目前,他致力于Google的Web搜索架构。
  1. 第1章 入门和基本概念
  2. 1.1 系统编程
  3. 1.1.1 为什么要学习系统编程
  4. 1.1.2 系统编程的基础
  5. 1.1.3 系统调用
  6. 1.1.4 c库
  7. 1.1.5 c编译器
  8. 1.2 api和abi
  9. 1.2.1 api
  10. 1.2.2 abi
  11. 1.3 标准
  12. 1.3.1 posix和sus的历史
  13. 1.3.2 c语言标准
  14. 1.3.3 linux和标准
  15. 1.3.4 本书和标准
  16. 1.4 linux编程的概念
  17. 1.4.1 文件和文件系统
  18. 1.4.2 进程
  19. 1.4.3 用户和组
  20. 1.4.4 权限
  21. 1.4.5 信号
  22. 1.4.6 进程间通信
  23. 1.4.7 头文件
  24. 1.4.8 错误处理
  25. 第2章 文件i/o
  26. 2.1 打开文件
  27. 2.1.1 系统调用open()
  28. 2.1.2 新建文件的所有者
  29. 2.1.3 新建文件的权限
  30. 2.1.4 creat()函数
  31. 2.1.5 返回值和错误码
  32. 2.2 通过read()读文件
  33. 2.2.1 返回值
  34. 2.2.2 读入所有字节
  35. 2.2.3 非阻塞读
  36. 2.2.4 其他错误码
  37. 2.2.5 read()调用的大小限制
  38. 2.3 调用write()写
  39. 2.3.1 部分写(partial write)
  40. 2.3.2 append(追加)模式
  41. 2.3.3 非阻塞写
  42. 2.3.4 其他错误码
  43. 2.3.5 write()大小限制
  44. 2.3.6 write()行为
  45. 2.4 同步i/o
  46. 2.4.1 fsync()和fdatasync()
  47. 2.4.2 sync()
  48. 2.4.3 o_sync标志位
  49. 2.4.4 o_dsync和o_rsync
  50. 2.5 直接i/o
  51. 2.6 关闭文件
  52. 2.7 用lseek()查找
  53. 2.7.1 在文件末尾后查找
  54. 2.7.2 错误码
  55. 2.7.3 限制
  56. 2.8 定位读写
  57. 2.9 文件截短
  58. 2.10 i/o多路复用
  59. 2.10.1 select()
  60. 2.10.2 poll()
  61. 2.10.3 poll()和select()的区别
  62. 2.11 内核内幕
  63. 2.11.1 虚拟文件系统
  64. 2.11.2 页缓存
  65. 2.11.3 页回写
  66. 2.12 结束语
  67. 第3章 缓冲i/o
  68. 3.1 用户缓冲i/o
  69. 3.2 标准i/o
  70. 3.3 打开文件
  71. 3.4 通过文件描述符打开流
  72. 3.5 关闭流
  73. 3.6 从流中读数据
  74. 3.6.1 每次读取一个字节
  75. 3.6.2 每次读一行
  76. 3.6.3 读二进制文件
  77. 3.7 向流中写数据
  78. 3.7.1 写入单个字符
  79. 3.7.2 写入字符串
  80. 3.7.3 写入二进制数据
  81. 3.8 缓冲i/o示例程序
  82. 3.9 定位流
  83. 3.10 flush(刷新输出)流
  84. 3.11 错误和文件结束
  85. 3.12 获取关联的文件描述符
  86. 3.13 控制缓冲
  87. 3.14 线程安全
  88. 3.14.1 手动文件加锁
  89. 3.14.2 对流操作解锁
  90. 3.15 对标准i/o的批评
  91. 3.16 结束语
  92. 第4章 高级文件i/o
  93. 4.1 分散/聚集i/o
  94. 4.2 event poll
  95. 4.2.1 创建新的epoll实例
  96. 4.2.2 控制epoll
  97. 4.2.3 等待epoll事件
  98. 4.2.4 边缘触发事件和条件触发事件
  99. 4.3 存储映射
  100. 4.3.1 mmap()
  101. 4.3.2 munmap()
  102. 4.3.3 存储映射实例
  103. 4.3.4 mmap()的优点
  104. 4.3.5 mmap()的不足
  105. 4.3.6 调整映射的大小
  106. 4.3.7 改变映射区域的权限
  107. 4.3.8 通过映射同步文件
  108. 4.3.9 给出映射提示
  109. 4.4 普通文件i/o提示
  110. 4.4.1 系统调用posix_fadvise()
  111. 4.4.2 readahead()系统调用
  112. 4.4.3 “经济实用”的操作提示
  113. 4.5 同步(synchronized),同步(synchronous)
  114. 及异步(asynchronous)操作
  115. 4.6 i/o调度器和i/o性能
  116. 4.6.1 磁盘寻址
  117. 4.6.2 i/o调度器的功能
  118. 4.6.3 改进读请求
  119. 4.6.4 选择和配置你的i/o调度器
  120. 4.6.5 优化i/o性能
  121. 4.7 结束语
  122. 第5章 进程管理
  123. 5.1 程序、进程和线程
  124. 5.2 进程id
  125. 5.2.1 分配进程id
  126. 5.2.2 进程体系
  127. 5.2.3 pid_t
  128. 5.2.4 获取进程id和父进程id
  129. 5.3 运行新进程
  130. 5.3.1 exec系统调用
  131. 5.3.2 fork()系统调用
  132. 5.4 终止进程
  133. 5.4.1 终止进程的其他方式
  134. 5.4.2 atexit()
  135. 5.4.3 on_exit()
  136. 5.4.4 sigchld
  137. 5.5 等待子进程终止
  138. 5.5.1 等待特定进程
  139. 5.5.2 等待子进程的其他方法
  140. 5.5.3 bsd中的wait3()和wait4()
  141. 5.5.4 创建并等待新进程
  142. 5.5.5 僵尸进程
  143. 5.6 用户和组
  144. 5.6.1 改变实际用户/组id和保留的用户/组id
  145. 5.6.2 改变有效的用户id或组id
  146. 5.6.3 bsd改变用户id和组id的方式
  147. 5.6.4 hp-ux中改变用户id和组id的方式
  148. 5.6.5 操作用户id/组id的首选方法
  149. 5.6.6 对保留的用户id的支持
  150. 5.6.7 获取用户id和组id
  151. 5.7 会话(session)和进程组
  152. 5.7.1 与会话相关的系统调用
  153. 5.7.2 与进程组相关的系统调用
  154. 5.7.3 废弃的进程组函数
  155. 5.8 守护进程
  156. 5.9 结束语
  157. 第6章 高级进程管理
  158. 6.1 进程调度
  159. 6.1.1 时间片
  160. 6.1.2 i/o约束型进程和处理器约束型进程
  161. 6.1.3 抢占式调度
  162. 6.2 完全公平调度器
  163. 6.3 让出处理器
  164. 6.4 进程优先级
  165. 6.4.1 nice()
  166. 6.4.2 getpriority()和setpriority()
  167. 6.4.3 i/o优先级
  168. 6.5 处理器亲和力(affinity)
  169. 6.6 实时系统
  170. 6.6.1 硬实时系统和软实时系统
  171. 6.6.2 延迟、抖动和截止期限
  172. 6.6.3 linux的实时支持
  173. 6.6.4 linux调度策略和优先级
  174. 6.6.5 设置调度参数
  175. 6.6.6 sched_rr_get_interval()
  176. 6.6.7 关于实时进程的注意事项
  177. 6.6.8 确定性
  178. 6.7 资源限制
  179. 6.7.1 限制项
  180. 6.7.2 获取和设置资源限制
  181. 第7章 线程
  182. 7.1 二进制程序、进程和线程
  183. 7.2 多线程
  184. 7.2.1 多线程代价
  185. 7.2.2 其他选择
  186. 7.3 线程模型
  187. 7.3.1 用户级线程模型
  188. 7.3.2 混合式线程模型
  189. 7.3.3 协同程序
  190. 7.4 线程模式
  191. 7.4.1 每个连接对应一个线程
  192. 7.4.2 事件驱动的线程模式
  193. 7.5 并发性、并行性和竞争
  194. 7.6 同步
  195. 7.6.1 互斥
  196. 7.6.2 死锁
  197. 7.7 pthreads
  198. 7.7.1 linux线程实现
  199. 7.7.2 pthread api
  200. 7.7.3 链接pthreads
  201. 7.7.4 创建线程
  202. 7.7.5 线程id
  203. 7.7.6 终止线程
  204. 7.7.7 join(加入)线程和detach(分离)线程
  205. 7.7.8 线程编码实例
  206. 7.7.9 pthread互斥
  207. 7.8 进一步研究
  208. 第8章 文件和目录管理
  209. 8.1 文件及其元数据
  210. 8.1.1 一组stat函数
  211. 8.1.2 权限
  212. 8.1.3 所有权
  213. 8.1.4 扩展属性
  214. 8.1.5 扩展属性操作
  215. 8.2 目录
  216. 8.2.1 获取当前工作目录
  217. 8.2.2 创建目录
  218. 8.2.3 删除目录
  219. 8.2.4 读取目录内容
  220. 8.3 链接
  221. 8.3.1 硬链接
  222. 8.3.2 符号链接
  223. 8.3.3 解除链接
  224. 8.4 拷贝和移动文件
  225. 8.4.1 拷贝
  226. 8.4.2 移动
  227. 8.5 设备节点
  228. 8.5.1 特殊设备节点
  229. 8.5.2 随机数生成器
  230. 8.6 带外通信(out-of-band communication)
  231. 8.7 监视文件事件
  232. 8.7.1 初始化inotify
  233. 8.7.2 监视
  234. 8.7.3 inotify事件
  235. 8.7.4 高级监视选项
  236. 8.7.5 删除inotify监视
  237. 8.7.6 获取事件队列大小
  238. 8.7.7 销毁inotify实例
  239. 第9章 内存管理
  240. 9.1 进程地址空间
  241. 9.1.1 页和页面调度
  242. 9.1.2 内存区域
  243. 9.2 动态内存分配
  244. 9.2.1 数组分配
  245. 9.2.2 调整已分配内存大小
  246. 9.2.3 释放动态内存
  247. 9.2.4 对齐
  248. 9.3 数据段的管理
  249. 9.4 匿名内存映射
  250. 9.4.1 创建匿名内存映射
  251. 9.4.2 映射到设备文件/dev/zero
  252. 9.5 高级内存分配
  253. 9.5.1 调试内存分配
  254. 9.5.2 获取统计信息
  255. 9.6 基于栈的分配
  256. 9.6.1 把字符串复制到栈中
  257. 9.6.2 变长数组
  258. 9.7 选择合适的内存分配机制
  259. 9.8 内存操作
  260. 9.8.1 字节设置
  261. 9.8.2 字节比较
  262. 9.8.3 字节移动
  263. 9.8.4 字节查找
  264. 9.8.5 字节加密
  265. 9.9 内存锁定
  266. 9.9.1 锁定部分地址空间
  267. 9.9.2 锁定全部地址空间
  268. 9.9.3 内存解锁
  269. 9.9.4 锁的限制
  270. 9.9.5 该页在物理内存中吗
  271. 9.10 投机性内存分配策略
  272. 第10章 信号
  273. 10.1 信号相关的概念
  274. 10.1.1 信号标识符
  275. 10.1.2 linux支持的信号
  276. 10.2 基本信号管理
  277. 10.2.1 等待信号
  278. 10.2.2 示例
  279. 10.2.3 执行和继承
  280. 10.2.4 把信号编号映射为字符串
  281. 10.3 发送信号
  282. 10.3.1 权限
  283. 10.3.2 示例
  284. 10.3.3 给进程本身发送信号
  285. 10.3.4 给整个进程组发送信号
  286. 10.4 重入
  287. 10.5 信号集
  288. 10.5.1 更多的信号集函数
  289. 10.5.2 获取待处理信号
  290. 10.5.3 等待信号集
  291. 10.6 高级信号管理
  292. 10.6.1 结构体siginfo_t
  293. 10.6.2 si_code的相关说明
  294. 10.6.3 发送带附加信息(payload)的信号
  295. 10.6.4 示例
  296. 10.7 信号是个unix“瑕疵”吗
  297. 第11章 时间
  298. 11.1 时间的数据结构
  299. 11.1.1 原始表示
  300. 11.1.2 微秒级精度
  301. 11.1.3 更精确的:纳秒级精度
  302. 11.1.4 对时间进行分解
  303. 11.1.5 进程时间类型
  304. 11.2 posix时钟
  305. 11.3 时间源精度
  306. 11.4 取得当前时间
  307. 11.4.1 更好的接口
  308. 11.4.2 高级接口
  309. 11.4.3 获取进程时间
  310. 11.5 设置当前时间
  311. 11.5.1 设置支持高精度的时间
  312. 11.5.2 设置时间的高级接口
  313. 11.6 玩转时间
  314. 11.7 睡眠和等待
  315. 11.7.1 以微秒级精度睡眠
  316. 11.7.2 以纳秒级精度睡眠
  317. 11.7.3 实现睡眠的高级方法
  318. 11.7.4 sleep的可移植实现
  319. 11.7.5 超时(overrun)
  320. 11.7.6 睡眠的其他方式
  321. 11.8 定时器
  322. 11.8.1 简单的闹钟
  323. 11.8.2 计时器(interval timer)
  324. 11.8.3 高级定时器
  325. 附录a c语言的gcc扩展
  326. 附录b 参考书目
书名:LINUX系统编程(第2版)
作者:Robert Love
译者:祝洪凯, 李妹芳, 付途 译
国内出版社:人民邮电出版社
出版时间:2014年03月
页数:420
书号:978-7-115-34635-3
原版书书名:Linux System Programming, 2nd Edition
原版书出版商:O'Reilly Media
Robert Love
 
Robert Love从早些年开始就是一个Linux用户和黑客。他活跃,也热衷于Linux内核和GNOME桌面社区。他现在对Linux内核的贡献包括从事内核事件层和inotify。GNOME相关的贡献包括Beagle,GNOME Volume Manager,Network Manager和Utopia项目。现在Robert在Google公司的Open Source Program Office(开源程序办公室)工作。
Robert是《Linux Kernel Development (SAMS, 2005)》和《Linux System Programming (O’Reilly, 2007)》两本书的作者。他也是Linux Journal的特约编辑。现在正在为O’Reilly做一项新的工作,这将是有史以来最伟大的书,不管是写作,给予或采用。Robert在佛罗里达大学获得了一个数学方面的BA(文学学士)学位和一个计算机科学方面的BS(理学学士)学位。值得自豪的是,Robert出生在佛罗里达州南部,现在称为马萨诸塞州剑桥的家里。