第Ⅰ部分 导论 3
第1章 GNU/Linux的历史 3
概述 3
Unix操作系统的历史 3
AT&T UNIX 4
BSD 4
GNU/LINUX的历史 4
GNU和自由软件基金会 5
Linux内核 5
合作 6
Linux的发行 7
小结 7
参考文献 7
第2章 GNU/Linux系统架构 9
概述 9
系统架构概要 9
Linux内核的架构 10
GNU系统库(glibc) 11
系统调用接口 11
内核组件 12
硬件 15
小结 16
资源 16
第3章 自由软件开发 17
概述 17
开放源码与自由软件 17
自由软件项目剖析 18
开源证书 18
GPL 19
Qt公共许可证 19
BSD许可证 20
证书小结 20
开源开发的问题 20
可用性/可靠性斜线上升 20
文档问题 21
自我 21
狂热 21
小结 22
参考文献 22
资源 22
第4章 Linux虚拟化与仿真 23
概述 23
什么是虚拟化? 23
虚拟化简史 24
虚拟化的意义 26
虚拟化的分类 27
完全虚拟化 27
准虚拟化 27
模拟 28
操作系统的虚拟化 29
硬件辅助虚拟化 30
开源虚拟化解决方案 31
QEMU 31
KVM 34
小结 35
第Ⅱ部分 GNU工具 39
第5章 GNU编译工具链 39
概述 39
编译简介 40
GCC的格式(编译,汇编和链接) 41
有用的选项 41
编译警告 42
GCC优化器 44
-O0优化 45
-O1优化(-O) 45
-O2优化 45
-Os优化 46
-O3优化 46
架构相关的优化 47
调试选项 48
其他工具 48
小结 49
第6章 应用GNU make构建软件 50
概述 50
示例项目 50
手工编译 51
buildit脚本 51
简单的Makefile文件 52
Makefile变量 54
模式匹配规则 57
自动依赖跟踪 58
小结 60
第7章 库的构建与使用 61
概述 61
什么是库? 61
生成静态库 62
共享库的生成 68
动态加载库 69
工具 73
file工具 73
size命令 73
nm命令 73
objdump工具 74
ranlib工具 76
小结 76
动态库API 76
第8章 用automake/autoconf打包 77
概述 77
一个简单的项目 78
Makefile解决方案 78
自动工具的简单运用 79
automake工具 81
autoconf工具 82
configure脚本 83
生成的Makefile文件 84
小结 85
第9章 GNU/Linux的源码控制 86
概述 86
源码控制的定义 86
源码控制范例 87
存储库的架构 87
修订模型 88
有用的源码控制工具 89
CVS 89
SVN 94
Git源码控制系统 99
小结 104
参考文献 105
资源 105
第10章 应用Gnuplot进行数据可视化 106
概述 106
Gnuplot 106
安装Gnuplot 107
用户界面 107
简单绘图 108
绘制文件中的数据 110
3D的函数绘制 111
3D等值线绘图 114
隐线消除 114
将图保存为文件 115
多图模式 116
使用Gnuplot的工具 117
小结 117
资源 118
第Ⅲ部分 应用程序开发主题 123
第11章 GNU/Linux的文件操作 123
概述 123
GNU/Linux的文件操作 123
探究文件操作API 124
创建一个文件句柄 124
打开文件 124
数据的读写 126
二进制数据的读写 133
基础API 138
小结 140
文件操作API 141
第12章 管道编程 142
概述 142
管道模型 142
管道和命名管道 143
旋风式简介 143
详细介绍 145
pipe函数 145
函数dup和dup2 147
函数mkfifo 149
系统命令 150
mkfifo命令 150
小结 151
管道编程API 151
第13章 套接字编程简介 152
概述 152
网络的分层模型 152
套接字编程的范式 153
主机 154
协议 154
端口 154
地址 154
套接字 155
客户端/服务器模式 155
应用程序示例 156
日期查询服务器 157
日期查询客户端 160
套接字API小结 161
创建和清除套接字 161
套接字地址 162
套接字的原语 163
其他“杂项”函数 168
其他传输协议 169
SCTP的特点 169
SCTP的特点其他 171
多语言视角 171
小结 173
套接字编程API 173
参考文献 174
资源 174
第14章 GNU/Linux进程模型 175
概述 175
GNU/Linux进程 175
旋风式简介 176
用fork创建一个子进程 177
与创建者进程同步 179
捕获信号 180
发出信号 181
传统的进程API 184
fork函数 185
wait函数 186
waitpid函数 187
signal函数 188
pause函数 192
kill函数 192
raise函数 193
exec变体 194
alarm函数 197
exit函数 198
POSIX信号 199
系统命令 202
ps命令 202
top命令 203
kill命令 203
小结 204
proc文件系统 204
资源 206
API小结 206
第15章 POSIX线程(P线程)编程 207
概述 207
什么是线程 208
线程函数基础 209
P线程API 209
线程基础 210
线程管理 211
线程的同步 212
线程互斥 214
线程条件变量 218
构建使用线程的应用程序 224
小结 225
参考资料 225
API小结 225
第16章 消息队列IPC 227
概述 227
消息队列简介 227
创建消息队列 228
配置一个消息队列 229
向一个消息队列中写入消息 230
从消息队列中读取消息 231
移除消息队列 232
消息队列API 233
msgget函数 233
msgctl函数 236
msgsnd函数 240
msgrcv函数 241
用户工具 243
小结 245
消息队列API函数 245
第17章 旗语同步 246
概述 246
旗语理论 246
旗语的类型 247
GNU/Linux旗语快速简介 248
创建旗语 249
获取和释放旗语 250
配置旗语 253
移除旗语 254
旗语API 255
semget函数 256
semctl函数 258
semop函数 264
用户工具 266
小结 268
旗语API 268
第18章 共享内存编程 269
概述 269
快速了解共享内存 270
创建共享内存区段 270
取得共享内存区段的信息 271
共享内存区段的挂接和脱离 272
使用共享内存区段 273
移除共享内存区段 275
共享内存API 276
shmget函数 276
shmctl函数 279
shmat函数 283
shmdt函数 284
使用共享内存区段 285
用户工具 289
小结 290
参考文献 290
共享内存API 291
第19章 高级文件操作 292
概述 292
测试文件类型 292
其他stat信息 294
确定当前工作目录 295
列举目录 296
使用inotify进行文件事件通知 299
通知过程 299
从文件系统中移除文件 304
传输数据 305
小结 305
高级文件操作API 305
第20章 其他应用程序开发主题 308
概述 308
使用getopt和getopt_long解析命令行选项 308
时间API 313
用sysinfo收集系统信息 315
使用mmap进行内存映射 317
锁定和解锁内存 320
Linux错误报告 322
小结 324
API小结 324
第Ⅳ部分 GNU/Linux的shell与脚本 331
第21章 GNU/Linux标准命令 331
概述 331
重定向 331
标准输入/输出/错误 332
环境变量 333
脚本调用 334
GNU/Linux基本命令 335
小结 344
第22章 Bourne-Again shell(Bash) 345
概述 345
预备知识 345
示例脚本 346
bash脚本 347
变量 347
条件结构 351
条件 351
case结构 355
循环结构 356
while循环 356
for循环 358
输入与输出 359
函数 361
示例脚本 362
简单的目录档案管理脚本 363
查找今天更新/创建的文件的脚本程序 364
其他脚本语言 366
小结 366
资源 367
第23章 使用sed进行编辑 368
概述 368
剖析一个简单的脚本 369
sed空间(缓冲器) 370
典型的sed命令行选项 370
正则表达式 371
操作范围 372
基本的sed指令 372
替换(s) 372
删除(d) 373
打印(P) 373
行的添加(a)、插入(i)以及改变(c) 373
退出(q) 374
转换(y) 374
行数(=) 375
保持样式空间(h) 375
小结 375
一些有用的sed单行程序 376
资源 376
第24章 使用awk进行文本处理 377
概述 377
awk简史 377
awk结构 377
命令行awk 378
脚本awk 381
其他awk样式 385
小结 385
有用的awk单行程序 386
第25章 使用flex和bison生成解析器 387
概述 387
词法分析和语法处理 387
词法分析器和解析器的通信 389
ex工具 390
bison工具 393
一个简单的语法 393
在bison中编写语法 394
连接语法解析器和词法分析器 396
构建一个简单的配置解析器 398
配置文件词法分析器 399
全局图像 403
小结 405
第26章 Ruby脚本编程 406
概述 406
Ruby简介 406
为什么使用Ruby 407
和其他语言的比较 407
Ruby快速示例 408
语言元素 410
类型和变量 410
控制 411
重复 412
Ruby中的字符串操作 413
关联数组 414
类与方法 415
高级功能 418
动态代码 418
异常处理 419
自省 421
其他功能 422
Ruby作为嵌入式语言 422
小结 422
资源 422
第27章 Python脚本编程 423
概述 423
Python简介 423
为什么使用Python 424
与其他语言的比较 424
Python快速示例 425
语言元素 428
类型和变量 428
控制 430
循环 430
Python中的字符串操作 432
关联数组 433
类与方法 434
高级功能 436
动态代码 437
函数式编程 437
异常处理 438
小结 440
资源 440
第28章 GNU/Linux管理基础 441
概述 441
Linux文件系统浏览 441
套件管理 442
Tar球发布 442
高级套件工具 445
内核更新 448
获得最新版的内核 448
配置内核 449
构建内核 450
安装内核 450
配置启动引导程序(Bootloader) 451
小结 451
第Ⅴ部分 调试与测试 455
第29章 软件单元测试框架 455
概述 455
单元测试 455
单元测试框架 457
打造自己的框架 457
C单元测试系统 462
嵌入单元测试 466
expect工具 469
小结 470
资源 471
第30章 用GDB进行调试 472
概述 472
为GDB进行编译 472
使用GDB 473
启动GDB 475
查看代码 475
使用断点 476
逐步运行程序 478
检查数据 479
改变数据 479
检查堆栈 480
停止程序 480
其他GDB调试主题 480
多进程应用程序调试 480
多线程应用程序调试 481
调试已有的进程 482
事后分析调试 483
小结 484
资源 484
第31章 代码硬化 485
概述 485
代码硬化技术 485
返回值 485
细察用户/网络的输入/输出 486
使用安全字符串函数 486
缓冲区溢出 486
在决定点提供逻辑选择 487
自识别结构体 488
报告错误 490
降低复杂度,从而减少潜在的错误 491
自保护的函数 491
最大调试输出 492
内存调试 492
编译器的支持 492
源码检查工具 493
代码跟踪 493
小结 495
资源 495
第32章 用GNU gcov进行覆盖测试 496
概述 496
什么是g 496
准备映像 496
使用gcov工具 498
查看分支概率 499
不完全覆盖 501
gcov可用的选项 502
注意事项 503
小结 504
参考文献 504
资源 504
第33章 用GNU gprof进行性能分析 505
概述 505
什么是性能分析 505
什么是gprof 505
准备映像 506
使用gprof工具 508
gprof可用的选项 510
注意事项 513
小结 513
参考文献 513
第34章 高级调试主题 514
概述 514
内存调试 514
Valgrind工具 514
Electric Fence 517
yamd工具 517
mtrace工具 520
交叉引用工具 521
Cscope工具 521
其他交叉引用工具 522
用ltrace跟踪系统调用 523
动态挂接GDB 525
小结 527
资源 527
附录 缩写与部分缩写词 528