前言 1
第1部分 Shell和基本工具 7
第1章 Linux编程环境简介 9
1.1 Linux编程基本概念 9
1.2 Linux设计 10
1.3 Linux文档 10
1.4 手册页 11
1.5 Info页 12
1.6 Perl文档 14
1.8 Internet资源 15
1.7 程序文档 15
1.9 小结 16
第2章 Shell编程简介 17
2.1 Bash简介 17
2.1.1 创建脚本 18
2.1.2 启动Bash 19
2.1.3 返回值 20
2.1.4 简单命令组合 21
2.1.5 通配符 26
2.1.6 引号和转义 26
2.1.7 注释 29
2.2 重定向和管道 30
2.2.1 输出重定向 31
2.2.2 输入重定向 35
2.2.3 管道 37
2.2.4 命令置换 40
2.3 变量 40
2.3.1 环境变量 42
2.3.2 特殊变量 44
2.4 函数 46
2.5 条件和循环 50
2.5.1 if 50
2.5.2 使用[...]测试 51
2.5.3 case 53
2.5.4 while 55
2.5.5 for 56
2.6 Shell应用 58
2.7 小结 59
第3章 使用正则表达式 61
3.1 正则表达式简介 61
3.1.1 模式 62
3.1.2 正则表达式语法 63
3.1.3 egrep简介 67
3.1.4 sed简介 69
3.1.5 Perl中的正则表达式 70
3.2 理解字符类 73
3.3 使用量词 75
3.4 备选与分组 80
3.5 在Linux下对正则表达式的支持 81
3.5.1 Perl 81
3.5.2 sed和awk 85
3.5.3 C/C++ 85
3.6 小结 86
第4章 Emacs简介 87
4.1 Emacs入门 87
4.1.1 Emacs键盘操作符号 87
4.1.2 浏览 89
4.1.3 搜索 90
4.1.4 Emacs区域 91
4.1.5 缓冲区 91
4.1.6 窗口 91
4.1.7 框架 93
4.1.8 语法和括弧高亮显示 93
4.2 主模式 94
4.2.1 C模式 95
4.2.2 Perl模式 97
4.2.3 其他模式 98
4.3 Emacs是一个IDE 98
4.3.2 调试 99
4.3.1 编译程序 99
4.3.3 使用标记 100
4.3.4 在Emacs中的Sehll 101
4.3.5 Term模式 103
4.3.6 Dired 104
4.3.7 w3 105
4.3.8 Gnus 107
4.3.9 版本控制 107
4.4 获取帮助 108
4.5 小结 109
5.1 基本概念 111
第5章 理解Linux数据文件和脚本 111
5.2 文件系统层次 112
5.2.1 根目录 112
5.2.2 /dev:设备文件 114
5.2.3 /etc:配置和启动文件 115
5.2.4 /usr:标准系统程序 115
5.2.5 /var:变量数据 115
5.3 passwd和shadow文件 116
5.3.1 从Shell中获取账号信息 117
5.3.2 从C中获取账号信息 118
5.3.3 从Perl中获取账号信息 120
5.4 组文件 121
5.5 init文件 122
5.6.1 DNS文件 126
5.6 网络文件 126
5.6.2 安全性文件 127
5.6.3 超级服务器文件 128
5.7 小结 129
第2部分 C环境 131
第6章 使用gcc 133
6.1 使用gcc编译程序 133
6.1.1 警告 134
6.1.2 优化gcc 135
6.1.3 产生调试标记 139
6.2.2 C++编译器:g++ 143
6.2.1 C编译器:gcc 143
6.2 gcc编译流程简介 143
6.2.3 C预处理器:cpp 144
6.2.4 程序员“礼品店” 147
6.3 管理大型项目 148
6.4 使用高级gcc选项 150
6.4.1 指定查找路径 151
6.4.2 连接库 151
6.4.3 使用管道加速编译过程 152
6.4.4 使用gcc的-v选项 152
6.4.5 使用ANSIC 155
6.5 小结 155
7.1 CNU make简介 157
第7章 使用GNU Make管理项目 157
7.1.2 一个简单的Makefile文件 158
7.1.1 Makefile规则 158
7.1.3 更巧妙的Makefile文件 161
7.2 使用智能的Makefile 166
7.2.1 两种变量类型 166
7.2.2 通配符:问题和解决办法 167
7.2.3 依赖性计算 169
7.3 创建其他文件 181
7.4 使用递归make 187
7.5 小结 194
8.1.1 静态分配内存 195
第8章 内存管理 195
8.1 静态与动态内存 195
8.1.2 动态分配内存 197
8.2 安全性和设计着眼点 201
8.3 高级指针 203
8.3.1 解析数据 214
8.3.2 代码分析 223
8.4 发现问题 225
8.5 小结 226
第9章 库和连接 227
9.1 库简介 227
9.2 创建和使用静态库 228
9.3 创建和使用共享库 232
9.4 使用高级共享库特性 234
9.4.1 ldd工具 234
9.4.2 soname 234
9.4.3 共享库装载器 236
9.4.4 使用LD_PRELOAD 236
9.4.5 使用dlopen 239
9.5 小结 239
第10章 使用gdb调试 241
10.1 gdb需求 241
10.2.1 调试指南 242
10.2 调试步骤 242
10.2.2 调试其他进程 249
10.3 显示数据 253
10.3.1 使用print和display命令 253
10.3.2 内存检查 259
10.3.3 使用Printf命令 260
10.3.4 使用set命令 261
10.4 使用断点和观察窗口 261
10.4.1 设置断点 261
10.4.2 设置观察窗口 264
10.5 core dump分析 268
10.6 命令小结 275
10.7 小结 278
第3部分 Linux模型 279
第11章 文件、目录和设备 281
11.1 文件的实质 281
11.1.1 系统调用stat( )和lstat( ) 282
11.1.2 opendir( )、readdir( )及其相关函数 292
11.2 I/O方法 299
11.2.1 基于流的I/O方法 299
11.2.2 系统调用I/O方法 300
11.3 特殊文件 303
11.4 小结 304
12.2 进程基础知识 305
12.1 理解进程模型 305
第12章 Linux系统中的进程 305
12.3 启动和终止进程 307
12.3.1 派生的基本原理 307
12.3.2 执行其他程序 308
12.3.3 等待进程 310
12.3.4 一起使用 318
12.4 使用返回代码 320
12.5 进程的同步措施 323
12.5.1 原子操作和非原子操作 324
12.5.2 死锁 325
12.5.3 竞争条件 325
12.5.4 自旋和忙等待 326
12.6 了解安全性 327
12.6.1 安全性的基本知识 327
12.6.2 安全性秘密 327
12.6.3 setuid和setgid 329
12.6.4 setuid和setgid的负效应 339
12.6.5 保证setuid和seteid的安全 340
12.7 小结 343
第13章 了解信号 345
13.1 信号的使用 345
13.2 信号处理程序 346
13.2.1 基本信号处理程序 346
13.2.2 阻塞信号 351
13.2.3 高级信号处理程序 357
13.3 信号发送 363
13.4 信号和系统调用 372
13.5 信号处理程序带来的危险 373
13.6 小结 373
第14章 Linux的I/O系统简介 375
14.1 程序库和系统调用 375
14.1.1 基于流的I/O方法 376
14.1.1 系统调用I/O方法 379
14.2 错误情况 386
14.2.1 使用封装的函数库 387
14.2.2 在读者自己的程序中使用封装函数库 395
14.3 高级I/O 399
14.3.1 稀疏文件 399
14.3.2 非阻塞I/O方式 401
14.4 内存映射的I/O 402
14.5 函数调用select( )和poll( ) 406
14.5.1 select( )函数 406
14.5.2 poll( )函数 411
14.6 咨询锁定 414
14.7 小结 419
第15章 终端编程 421
15.1 终端属性 422
15.2 伪终端 425
15.3 Ncurses 429
15.4 小结 456
第4部分 与世界交流 457
第16章 共享内存和信号量 459
16.1 使用共享内存 459
16.2 使用信号量同步 460
16.3 利用共享内存通信 470
16.4 小结 487
第17章 使用管道和FIFO 489
17.1 建立管道 490
17.2 实现重定向 499
17.4 使用FIFO 504
17.3 解决通信问题 504
17.5 小结 509
第18章 Internet套接字 511
18.1 TCP/IP简介 511
18.1.1 问题 511
18.1.2 解决方案 512
18.1.3 术语注解 513
18.2 TCP/IP的独特挑战 513
18.3 协议 514
18.4 寻址 515
18.5 客户端连接 516
18.6 服务器端连接 519
18.7 一个网络函数库 529
18.8 小结 542
第19章 高级ICP/IP套接字 543
19.1 服务器设计和多工化 543
19.2 用户数据报协议 552
19.3 小结 552
第5部分 利用Perl协同工作 553
第20章 Perl简介 555
20.1 Perl的设计思想 555
20.1.1 变量 556
20.1.2 数组 557
20.1.3 哈希表 558
20.2 第一步 559
20.3 数据结构 565
20.3.1 引用 565
20.3.2 匿名引用 566
20.3.3 符号引用 567
20.3.4 数组 567
20.3.5 嵌套哈希表 572
20.4 子例程和作用域 577
20.5 流控制 579
20.6 OOP特征 580
20.7 小结 588
21.1 读取数据 589
第21章 利用Perl操作数据 589
21.2 分析和处理数据 591
21.2.1 使用split 593
21.2.2 使用grep 595
21.3 保存数据 596
21.3.1 使用数据库 596
21.3.2 使用Data Dumper 607
21.3.3 Data Dumper选项 611
21.4 输出和特别考虑的问题 612
21.4.1 基本输出 612
21.4.3 open的选项 613
21.4.2 输出到文件或命令 613
21.4.4 传递文件句柄 614
21.4.5 文件句柄的作用域 614
21.5 小结 615
第22章 CGI编程 617
22.1 CGI与Web 617
22.2 编写CGI脚本 618
22.3 处理无连接问题 630
22.4 解决性能问题 632
22.5 小结 632
23.1 数据库简介 633
第23章 利用DBI访问SQL数据库 633
23.2 使用DBI的第一步 634
23.3 使用SQL 638
23.3.1 创建表 638
23.3.2 插入数据 639
23.3.3 读取数据 640
23.3.4 更新表 643
23.3.5 删除信息 644
23.3.6 连接表 645
23.4 在应用程序中使用数据库 648
23.4.1 DBI和命令行 648
23.4.2 DBI和CGI 652
23.5 小结 666
第6部分 使用X的图形界面 667
第24章 利用Perl/TK的GUI 669
24.1 Linux中的CUI编程 669
24.1.1 X Window系统基础 670
24.1.2 位置无关性 670
24.2 客户解剖 670
24.2.1 Xlib 671
24.2.2 构件集 671
24.2.3 层次化窗口 671
24.2.4 配置 671
24.4 使用Perl/TK的第一步 672
24.3 基于事件的编程 672
24.5 对象属性 674
24.6 特殊对象 679
24.6.1 窗框 679
24.6.2 菜单 679
24.6.3 文本和画布 684
24.7 几何管理器 686
24.8 特别考虑的问题 691
24.9 SpecTcl/SpecPerl 691
24.10 小结 694
第25章 利用GNOME建立GUI 695
25.1 使用GNOME组件 695
25.2 第一步 696
25.3 绘制窗口 699
25.4 其他GNOME注解 703
25.5 小结 704
第7部分 将一切组织起来 705
第26章 利用CVS管理归档和协作 707
26.1 CVS简介 707
26.2 建立仓库 708
26.3 CVS的日常使用 709
26.4 使用标记和分支 713
26.4.1 标记 714
26.4.2 分支 715
26.5.2 生成ssh键 717
26.5 访问网络 717
26.5.1 设置服务器 717
26.5.3 境变量 718
26.6 技巧和诀窍 719
26.6.1 关键词 719
26.6.2 二进制文件 720
26.6.3 使用子目录 721
26.6.4 CVSROOT文件 721
26.7 小结 722
第27章 理解安全性和代码 723
27.1 好代码的重要性 723
27.2.2 访问控制 724
27.2 Linux安全性概览 724
27.2.1 验证 724
27.3 安全性的指导方针 726
27.3.1 安全性原则 726
27.3.2 常见问题 728
27.3.3 编写安全代码 729
27.4 小结 732
第28章 优化性能 733
28.1 更快代码的原则 733
28.1.1 三种度量 733
28.1.2 循环 733
28.1.5 重新编写时间关键代码块 736
28.1.6 增加块大小 736
28.1.3 帮助优化器 736
28.1.4 避免浮点数 736
28.2 高价操作和廉价操作 737
28.2.1 系统调用 737
28.2.2 fork 737
28.2.3 exec 737
28.2.4 system 737
28.3 编译器优化 738
28.4 使用gprof 738
28.5 小结 748