第1章 概貌 1
1.1 Linux既往成就 1
1.2 Linux预期成就 1
第1部分 Linux编程工具包 1
1.3 Linux简史 2
1.4 Linux与UNIX 2
1.5 Linux编程 2
1.6 为何选择Linux编程 3
1.7 小结 3
第2章 设置开发系统 4
2.1 硬件选择 4
2.1.1 硬件选择上的考虑 4
2.2 处理器/主板 5
2.2.1 板上I/O 6
2.2.2 处理器 6
2.2.4 内存 7
2.2.5 机箱和电源 7
2.2.3 BIOS 7
2.3 用户交互硬件:视频、声音、键盘及鼠标 8
2.3.1 显卡 8
2.3.2 显示器 9
2.3.3 声卡 10
2.4 键盘与鼠标 10
2.5 通信设备、端口及总线 11
2.5.1 调制解调器 11
2.5.2 网络接口卡 12
2.5.5 串行卡(包括多端口) 13
2.5.3 SCSI 13
2.5.4 USB与火线(IEEE 1394) 13
2.5.6 IRDA 14
2.5.7 PCMCIA卡 14
2.5.8 ISA即插即用设备 14
2.6 存储设备 14
2.6.1 硬盘 14
2.6.2 可移动磁盘设备 14
2.7.1 打印机 15
2.7 外围设备 15
2.6.3 CD-ROM/DVD 15
2.6.4 磁带备份设备 15
2.7.2 扫描仪 16
2.7.3 数字相机 17
2.7.4 家居自动控制设备 17
2.8 完备型系统 17
2.9 便携系统 18
2.10 安装 18
2.11 小结 21
3.2 使用简介 22
第3章 使用GNU cc 22
3.1 GNU cc特性 22
3.3 常用命令行选项 24
3.3.1 函数库和包含文件 25
3.3.2 出错检查及警告 26
3.4 优化选项 27
3.5 调试选项 28
3.6 GNU C扩展 29
3.7 小结 30
4.2 缩写makefile 31
第4章 使用GNU make管理项目 31
4.1 为何使用make 31
4.3 有关makefile编写的详细规则 33
4.3.1 伪目标 33
4.3.2 变量 33
4.3.3 环境变量、自动变量及预定义变量 35
4.3.4 隐式规则 36
4.3.5 模式规则 36
4.5 调试make 37
4.4 额外的make命令行选项 37
4.3.6 注释 37
4.6 常见的make出错消息 38
4.7 有用的makefile目标 38
4.8 小结 38
第5章 使用autoconf创建自配置软件 39
5.1 理解autoconf 39
5.1.1 创建configure. in文件 40
5.1.2 构造文件 40
5.2.1 候选程序测试 41
32.1 Java简介 41
5.2 内置宏 41
5.1.3 有用的autoconf实用工具 41
5.2.2 库函数测试 42
5.2.3 头文件测试 43
5.2.4 结构测试 44
5.2.5 类型定义测试 44
5.2.6 编译器行为测试 44
5.2.7 系统服务测试 45
5.2.8 UNIX变种测试 45
5.3 普通宏 46
5.4 一个带注解的autoconf脚本 47
5.5 小结 52
第6章 比较和归并源文件 53
6.1.1 理解cmp命令 53
6.1 比较文件 53
6.1.2 理解diff命令 55
6.1.3 理解diff3命令 60
6.1.4 理解sdiff命令 63
6.2 准备源代码补丁 63
6.2.1 patch命令行选项 64
6.2.2 创建补丁 64
6.3 小结 65
6.2.3 使用补丁 65
第7章 使用RCS控制版本 66
7.1 术语 66
7.2.1 ci和co 67
7.2 RCS基本用法 67
7.2.2 RCS关键字 69
7.2.3 ident命令 70
7.3 rcsdiff 71
7.4 其他RCS命令 73
7.4.4 rcsmerge 74
7.4.2 rlog 74
7.4.3 rcs 74
7.4.1 rcsclean 74
7.5 小结 75
第8章 在Emacs中创建程序 76
8.1 Emacs简介 76
8.1.1 启动与停止Emacs 76
8.1.2 移动 78
8.1.3 插入文本 79
8.1.4 删除文本 79
8.1.5 查找和替换 80
8.1.6 保存和打开文件 81
8.1.7 多窗口 82
8.2.1 缩进约定 83
8.2 支持编程的特性 83
8.2.2 语法高亮度显示 84
8.2.3 使用注释 84
8.2.4 使用Emacs进行编译 85
8.2.5 定制简介 87
8.3 使用Emacs Lisp自动完成Emacs操作 89
8.4 小结 91
9.2 使用文件描述符的系统调用 92
9.1 文件描述符 92
第9章 I/O例程 92
第2部分 系统编程 92
9.2.1 open()调用 93
9.2.2 close()调用 94
9.2.3 read()调用 94
9.2.4 write()调用 94
9.2.5 ioctl()调用 94
9.2.6 fcntl()调用 95
9.2.7 fsync()调用 95
9.2.8 ftruncate()调用 96
9.2.9 lseek()调用 96
9.2.10 dup()t duo2()调用 96
9.2.11 select()调用 97
9.2.12 fstat()调用 101
9.2.13 fchown()调用 102
9.2.14 fchmod()调用 102
9.2.15 fchdir()调用 103
9.2.16 flock()调用 103
9.2.17 pipe()调用 103
9.3 文件类型 104
9.3.1 普通文件 104
9.3.2 磁带I/O 106
9.3.3 串口I/O 109
9.3.4 打印机接口 109
9.3.5 声卡 109
9.4 小结 109
第10章 文件操作 110
10.1 文件操作函数 110
10.1.1 打开/关闭文件 110
10.1.2 基本的读和写 111
10.1.3 状态函数 111
10.2 格式化输出 112
10.2.1 格式化输入 114
10.2.2 基于字符和行的输入输出 115
10.2.4 缓冲区控制 116
10.2.3 文件定位 116
10.2.5 删除和改名 117
10.2.6 临时文件 117
10.3 小结 118
第11章 进程控制 119
11.1 进程的属性 119
11.2.1 fork()系统调用 120
11.2.2 exec()函数族 120
11.2 系统调用及库函数 120
11.2.3 system()和popen()函数 121
11.2.4 clone()函数调用 121
11.2.5 wait()、waitpid()、wait3()以及wait4()系统调用 122
11.2.6 select()系统调用 122
11.2.7 信号 122
11.2.8 程序的中止 124
11.2.9 闹钟和计时器 125
11.3 调度参数 126
11.4 线程 127
11.4.1 pthread-create()函数 128
11.4.2 pthread-exit()函数 128
11.4.3 pthread-join()函数 128
11.4.4 属性的控制 129
11.4.5 pthread-atfork()函数 130
11.4.6 取消线程 130
11.4.8 pthread-cond-init()函数 131
11.4.7 pthread-cleanup-push()宏 131
11.4.9 pthread-equal()函数 132
11.4.10 互斥 132
11.5 编程示例 132
11.5.1 子库 133
11.5.2 例子child-demol.c程序 143
11.5.3 例子程序child-demo2.c 145
11.5.4 例子程序child-demo3.c 150
11.6 小结 151
12.1 进程的信息 152
第12章 访问系统信息 152
12.1.1 cmdline文件 153
12.1.2 environ文件 153
12.1.3 fd目录 153
12.1.4 mem文件 153
12.1.5 stat文件 153
12.1.11 statm文件 155
12.2.2 /proc/cpuinfo文件 155
12.2.1 /proc/cmd/line文件 155
12.2 普通的系统信息 155
12.1.8 exe符号链接 155
12.1.10 root符号链接 155
12.1.9 maps文件 155
12.1.7 cwd符号链接 155
12.1.6 status文件 155
12.2.10 /proc/ksyms文件 156
12.2.9 /proc/kmsg文件 156
12.2.7 /proc/ioports文件 156
12.2.8 /proc/kcore文件 156
12.2.5 /proc/filesystems文件 156
12.2.4 /proc/dma文件 156
12.2.3 /proc/devices文件 156
12.2.6 /proc/interrupts文件 156
12.2.15 /proc/misc文件 157
12.2.17 /proc/mounts文件 157
12.2.16 /proc/modules文件 157
12.2.18 /proc/pci文件 157
12.2.14 /proc/meminfo文件 157
12.2.13 /proc/mdstat文件 157
12.2.12 /proc/locks文件 157
12.2.11 /proc/loadavg文件 157
12.2.19 /proc/rtc文件 158
12.2.20 /proc/stat文件 158
12.2.21 /proc/uptime文件 158
12.2.22 /proc/version文件 158
12.2.23 /proc/net子目录 158
12.2.24 /proc/scsi子目录 159
12.2.25 /proc/sys目录 159
12.3 函数库和实用工具 160
12.4 小结 160
13.2.1 assert()宏 161
第13章 出错处理 161
13.2 C语言机制 161
13.1 出错处理简述 161
13.2.2 使用预编译 163
13.2.3 标准库工具 165
13.2.4 对错误代码errno的理解 165
13.2.5 使用函数abort() 166
13.2.6 使用函数exit() 166
13.2.7 使用函数atexit() 167
13.2.9 使用函数perror() 168
13.2.8 使用函数strerror() 168
13.3 系统日志工具 169
13.3.1 用户程序 173
13.4 小结 173
第14章 内存管理 174
14.1 C内存管理的回顾 174
14.1.1 malloc()函数的使用 174
14.1.2 calloc()函数的使用 174
14.1.5 alloca()函数的使用 175
14.1.3 realloc()函数的使用 175
14.1.4 free()函数的使用 175
14.2 内存映像文件 177
14.2.1 mmap()函数的使用 177
14.2.2 munmap()函数的使用 178
14.2.3 msync()函数的使用 178
14.2.4 mprotect()函数的使用 179
14.2.5 锁住内存 179
14.2.6 mremap()函数的使用 179
14.2.7 用内存映像实现cat(1) 180
14.3 发现并修改内存管理错误 181
14.3.1 一个有问题的程序 182
14.3.2 用mpr和check定位内存错误 183
14.3.3 Electric Fence 185
14.3.4 使用Lint Brush 187
14.4 小结 188
第3部分 进程间通信和网络编程 189
第15章 IPC入门:使用管道 189
15.1 管道使用简介 190
15.1.1 无名管道 190
15.1.2 有名管道 191
15.2 小结 193
16.1 创建一个使用消息队列示例程序 194
第16章 消息队列 194
16.2 运行这个消息队列示例程序 196
16.3 小结 196
第17章 共享内存 197
17.1 把Linux配置成使用共享内存 197
17.2 创建一个使用共享内存的例子程序 197
17.3 运行共享内存示例程序 199
17.4 小结 200
18.1 使用信号灯的示例程序 201
第18章 信号灯 201
18.2 运行信号灯示例程序 205
18.3 小结 206
第19章 TCP/IP和套接口编程 207
19.1 支持套接口编程的系统调用 207
19.1.1 socket 207
19.1.2 bind 208
19.1.3 listen 209
19.1.4 connect 209
19.1.5 recv 210
19.1.6 send 210
19.2 使用套接口的客户/服务器例子程序 211
19.2.1 服务器例子程序 211
19.2.2 客户例子程序 212
19.2.4 使用Web浏览器作为客户运行服务器例子程序 213
19.2.3 运行客户和服务器例子程序 213
19.3 一个简单的Web服务器程序和Web客户程序 214
19.3.1 实现一个简单的Web服务器程序 214
19.3.2 实现一个简单的Web客户程序 216
19.3.3 测试这个Web服务器程序和Web客户程序 216
19.3.4 使用Netscape Navigator作为客户运行这个简单Web服务器程序 217
19.4 小结 218
第20章 UDP:用户数据协议 219
20.1 一个发送UDP数据的例子程序 219
20.2 一个接收UDP数据的例子程序 220
20.3 运行这两个UDP例子程序 221
20.4 小结 222
第21章 使用多播套接口 223
21.1 把Linux配置成支持多播IP 223
21.2 几个使用多播IP的例子程序 224
21.2.1 使用多播IP广播数据的例子程序 225
21.2.2 监听多播IP广播的例子程序 226
21.2.3 运行这两个多播IP例子程序 227
21.3 小结 228
第22章 非阻塞套接口I/O 229
22.1 使用非阻塞套接口I/O的例子程序 229
22.2 运行这个非阻塞套接口I/O的例子程序 232
22.3 小结 232
23.1.1 理解客户程序的设计 233
23.1 C++客户/服务器类的设计 233
第23章 用于TCP套接口的一个C++类库 233
23.1.2 理解服务器设计 235
23.2 C++客户/服务器类的实现 236
23.2.1 实现客户程序 236
23.2.2 实现服务器 237
23.3 测试这个客户/服务器类 238
23.4 小结 240
第24章 使用库 241
24.1 比较libc5和libc6 241
24.2.2 理解ar命令 242
24.2.1 理解nm命令 242
24.2 库操作工具 242
24.2.4 理解ldconfig 243
24.2.3 理解ldd命令 243
24.2.5 环境变量和配置文件 244
24.3 编写并使用静态库 244
24.4 编写并使用享库 249
24.5 使用动态加载的共享对象 251
24.5.1 理解dl接口 251
24.5.2 加载共享对象 251
24.5.6 使用dl接口 252
24.5.4 检查错误 252
24.5.5 卸载共享对象 252
24.5.3 使用共享对象 252
24.6 小结 254
第25章 设备驱动程序 255
25.1 驱动程序类型 255
25.1.1 静态链接的内核设备驱动程序 255
25.1.2 可加载的内核模块 255
25.1.5 特权用户模式程序 256
25.1.4 无特权用户模式程序 256
25.1.3 共享库 256
25.2 演示用的硬件 257
25.1.6 守护进程 257
25.1.7 字符设备与块设备 257
25.2.1 步进电机工作原理 258
25.2.2 标准或双向并口 260
25.3 开发配置 262
25.4 低层端口I/O 262
25.5 引发使用设备驱动程序的中断 264
25.7 一个简单的用户模式测试驱动程序 265
25.6 使用DMA访问内存 265
25.8 调试内核级驱动程序 266
25.9 下半部与上半部 267
25.10 创建一个内核驱动程序 267
25.10.1 查看源代码 267
25.10.2 编译驱动程序 291
25.10.3 使用内核驱动程序 291
25.10.4 未来发展方向 292
25.12 小结 293
25.11 其他信息来源 293
第26章 底层终端控制 294
26.1 终端接口 294
第4部分 用户界面编程 294
26.2 控制终端 295
26.2.1 属性控制函数 296
26.2.2 速度控制函数 297
26.2.3 行控制函数 297
26.2.4 进程控制函数 298
26.3 使用终端接口 299
26.4 改变终端模式 301
26.5.1 terminfo能力 303
26.5 使用terminfo 303
26.5.2 使用terminfo 304
26.5.3 发挥terminfo能力 307
26.6 小结 310
第27章 使用ncurses操纵屏幕 311
27.1 ncurses简史 311
27.2 使用ncurses编译程序 312
27.3 调试ncurses程序 312
27.4 关于窗口 312
27.4.1 ncurses的窗口设计 313
27.4.2 ncurses的函数命名约定 314
27.5.2 ncurses终止 315
27.5 初始化与终止 315
27.5.1 ncurses初始化结构 315
27.5.3 说明ncurses的初始化与终止 316
27.6 输入与输出 318
27.6.1 输出例程 318
27.6.2 输入例程 326
27.7 颜色例程 329
27.8 窗口管理 331
27.9 其他实用函数 331
27.10 小结 334
第28章 X Window编程 335
28.1 X的概念 335
28.2 Xlib API 336
28.2.1 XopenDisplay 337
28.2.2 XcreateSimpleWindow和XcreateWindow 337
28.2.5 事件处理 338
28.2.4 撤消窗口 338
28.2.3 映射窗口和撤消映射窗口 338
28.2.6 初始化图形设备上下文和字体 340
28.2.7 在X窗口中绘图 340
28.2.8 一个Xlib的示例程序 341
28.3 X工具包API 344
28.3.1 准备使用X工具包 344
28.3.2 使用X工具包设置窗口部件参数 345
28.4 小结 346
第29章 使用Athena和Motif的窗口部件 347
29.1.1 Athena的标签窗口部件 347
29.1 使用Athena的窗口部件 347
29.1.2 Athena的命令按钮窗口部件 348
29.1.3 Athena的列表窗口部件 351
29.1.4 Athena的文本窗口部件 352
29.1.5 Athena的简单菜单窗口部件 355
29.2 使用Motif的窗口部件 357
29.2.1 Motif的标签窗口部件 358
29.2.2 Motif的列表窗口部件 359
29.2.3 Motif的文本窗口部件 360
29.3.1 使用fetch-url.c文件 363
29.3 编写一个定制的Athena窗口部件 363
29.3.2 使用URL.h文件 365
29.3.3 使用URLP.h文件 366
29.3.4 使用URL.c文件 367
29.3.5 测试URL窗口部件 369
29.4 在C++程序中同时使用Athena和Motif 370
29.5 使用封装Athena窗口部件的一个C++类库 371
29.5.1 Conmponent类 372
29.5.2 PanedWindow类 373
29.5.3 Label类 375
29.5.4 Button类 376
29.5.5 Text类 377
29.6 小结 379
第30章 使用GTK进行GUI编程 380
30.1 GTK简介 381
30.1.1 处理GTK中的事件 382
30.1.2 使用GTK的示例程序 383
30.1.4 GTK容器窗口部件 385
30.1.3 其他GTK窗口部件 385
30.2 用于显示XML文件的GTK程序 386
30.2.1 XML简介 387
30.2.2 James Clark的XML分析器Expat 388
30.2.3 GTK的XML显示程序实现 389
30.2.4 运行GTK的XML显示程序 394
30.3 使用Notebook窗口部件的GUI程序 394
30.3.1 Notebook窗口部件示例程序的实现 394
30.3.2 实现绘图窗口部件 396
30.3.3 运行GTK Notebook窗口部件示例程序 398
第31章 使用Qt进行GUI编程 400
31.1 通过重载QWidget类方法处理事件 401
31.1.1 QWindget类概述 401
31.1.2 实现DrawWidget类 403
31.1.3 测试DrawWidget 405
31.2 使用Qt槽和信号处理事件 405
31.2.1 派生StateLCDWidget类 406
31.2.2 使用信号和槽 408
31.3 小结 410
31.2.3 运行信号/槽示例程序 410
第32章 使用Java进行GUI编程 412
32.1.1 Java是一种面向对象的语言 412
32.1.2 在Java中使用包 415
32.1.3 使用java读写文件 416
32.1.4 在Java中使用多个线程 419
32.1.5 在Java中进行套接口编程 420
32.2 使用Java编写一个聊天引擎 424
32.3 AWT简介 428
32.4 使用AWT编写一个聊天程序 430
32.5 JFC简介 434
32.6 使用JFC编写一个聊天程序 437
32.7 使用本机Java编译器 440
32.8 小结 440
第33章 OpenGL/Mesa图形编程 441
33.1 OpenGL是一个图形硬件的软件接口 441
33.2 Orbits示例程序 442
33.2.1 为OpenGL图形创建窗口以及对OpenGL初始化 442
33.2.2 使用GLUT创建简单的三维物体 443
33.2.4 沿着X-,Y-,Z-中的任何轴或所有轴旋转物体 445
33.2.3 在三维空间中使用X-Y-Z坐标放置物体 445
33.2.5 启用材料属性 446
33.2.6 启用深度值测试 447
33.2.7 处理键盘事件 447
33.2.8 为获得动画效果对OpenGL图形进行更新 447
33.2.9 示例程序清单 447
34.2 bash基础知识 451
34.2.1 通配符 451
第34章 使用GNU bash进行Shell编程 451
34.1 为何使用bash 451
第5部分 特殊编程技术 451
34.2.2 花括弧展开式 452
34.2.3 特殊字符 452
34.3 使用bash变量 453
34.4 使用bash操作符 455
34.4.1 字符串操作符 456
34.4.2 模式匹配操作符 457
34.5.1 条件执行:if 458
34.5 流控制 458
34.5.2 确定性循环:for 462
34.5.3 非确定性循环:while和until 462
34.5.4 选择结构:case和select 463
34.6 shell函数 465
34.7 输入与输出 466
34.7.1 I/O重定向 466
34.7.2 字符串I/O 467
34.8 命令行处理 469
34.9 进程和作业控制 471
34.9.1 shell的信号处理 471
34.9.2 使用trap 471
34.10 小结 473
第35章 有关安全性的编程 474
35.1 应用程序类型 474
35.1.1 setuid程序 474
35.1.2 网络服务器(守护进程) 474
35.1.6 工具程序 475
35.1.5 CGI程序 475
35.1.4 邮件用户代理程序 475
35.1.3 网络客户程序 475
35.1.7 应用程序 476
35.2 特殊的代码问题 476
35.2.1 shell脚本和system()系统调用 476
35.2.2 来自不信任用户的输入 477
35.2.3 缓冲区溢出 477
35.2.4 环境变量 480
35.2.5 gethostbyname()函数 482
35.2.6 信号 482
35.2.7 user ID和group ID 483
35.2.8 函数库的脆弱性 485
35.2.9 执行其他程序 485
35.2.10 /tmp竞争 485
35.2.11 拒绝服务型攻击 485
35.2.12 随机数 487
35.2.13 令牌 487
35.2.14 密码 487
35.2.15 文件名 488
35.2.16 符号链接 489
35.2.17 chroot()环境 498
35.2.19 进程间通信 499
35.2.18 分割程序 499
35.2.20 identd守护进程 500
35.2.21 TCP与UDP 500
35.2.22 动态与静态内存分配 501
35.2.23 安全级别 502
35.2.24 POSIX.le的能力 502
35.3 擦除缓冲区 502
35.4 穿越防火墙提交HTML表单 502
35.7 预先派生子进程的服务器的问题 503
35.6 HTML服务器包含特性 503
35.5 窃呼、盗取及中间人攻击 503
35.8 超时 504
35.9 三因素认证 504
35.10 可插入的认证模块 505
35.11 一般的程序健壮性问题 505
35.12 加密技术 505
35.12.1 加密算法的类型 506
35.12.2 加密系统 507
35.12.3 加密的脆弱性 507
35.13 小结 508
第36章 调试:GNU gdb 509
36.1 为使用gdb进行编译 509
36.2 使用基本的gdb命令 509
36.2.1 启动gdb 510
36.2.2 在调试器中查看代码 511
36.2.3 检查数据 512
36.2.4 设置断点 513
36.2.5 检查并更改运行中的代码 515
36.3.1 变量的作用域和上下文 516
36.3 高级gdb概念和命令 516
36.3.2 遍历函数调用栈 517
36.3.3 操纵源文件 518
36.3.4 与Shell进行通信 519
36.3.5 附加到某个运行中的程序 520
36.4 小结 520
第6部分 补充内容 521
第37章 软件包管理 521
37.1 理解tar文件 521
37.1.1 创建tar文件 522
37.2 理解install命令 523
37.1.3 列出tar文件的内容 523
37.1.2 更新tar文件 523
37.3 理解Red Hat软件包管理器 525
37.3.1 最小要求 526
37.3.2 配置RPM 526
37.3.3 控制构造过程:使用spec文件 527
37.3.4 分析一个spec文件 528
37.3.5 构造软件包 530
37.4 小结 531
38.1.1 手册页面的组成 532
38.1.2 手册页面例子及解释 532
38.1 手册页面 532
第38章 建档 532
38.1.3 使用groff命令 534
38.1.4 Linux约定 535
38.2 使用SGML工具创建SGML文档 536
38.2.1 SGML工具 537
38.2.2 SGML工具的标记 540
38.2.3 格式化SGML文档 541
38.3 小结 541
39.1 MIT/X风格的许可证 542
第39章 许可证的发放 542
39.3 Artistic许可证 543
39.2 BSD风格的许可证 543
39.4 GNU通用公共许可证 544
39.4.1 GNU通用公共许可证(GPL) 544
39.4.2 GNU库通用公共许可证(LGPL) 545
39.5 开放源代码的定义 546
39.6 选择正确的许可证 547
附录A 符号表函数库 548
A.1 可用的文档 548
第7部分 附录 548
A.1.1 示例程序:userchange 549
A.1.2 定义一个符号表来描述一个结构类型 549
A.1.3 定义一个变量的随机集 551
A.1.4 包含另一个符号表 553
A.1.5 出错报告 554
A.1.6 智能指针 555
A.1.7 符号表库函数 555
A.1.8 执行例子 560
附录B GNU通用公共许可证(General Public License) 562