第一章 Linux的历史和功能简介 1
1.1 什么是Linux 1
1.2 Linux的历史 2
1.3 Linux的特点 3
1.4 Linux与自由软件及GNU的关系 4
1.5 Linux的组成 6
1.5.1 存储管理 6
1.5.2 进程管理 6
1.5.3 文件系统 7
1.5.4 进程间通信 7
1.6 Linux的用途 7
1.6.1 个人UNIX工作站 7
1.6.2 X终端客户 8
1.6.3 X应用服务器 8
1.6.4 UNIX开发平台 8
1.6.5 网络服务器 8
1.6.6 Internet服务器 8
1.6.7 终端服务器、传真服务器、Modem服务器 9
1.7 Linux的发行版本 9
1.8 红帽子6.0的新特性 10
1.9 Linux的不足之处 10
第二章 基础知识 12
2.1 硬件基础 12
2.1.1 CPU 12
2.1.2 存储器 13
2.1.3 总线 14
2.1.4 控制器和外围设备 14
2.1.5 地址空间 14
2.1.6 定时器 15
2.2 软件基础 15
2.2.1 计算机语言 15
2.2.2 操作系统 17
2.2.3 内核数据结构 20
2.3 小结 21
第三章 Linux程序开发工具简介 22
3.1 C语言的编译器和调试器 22
3.1.1 GCC的基本用法 23
3.1.2 一些常用的选项 23
3.1.3 优化选项 24
3.1.4 用gdb调试程序 24
3.1.5 图形的调试工具xxgdb 27
3.1.6 cproto 28
3.1.7 grpof 29
3.1.8 其他工具 29
3.2 C++语言简介及其编译器与调试器 29
3.2.1 为什么使用C++ 30
3.2.2 调试C++程序 31
3.2.3 调试异常处理 31
3.2.4 GNU的C++类库 32
3.3 make 36
3.3.1 make简介 36
3.3.2 Makefile文件 37
3.3.3 make的内建规则 39
3.3.4 使用Autoconf和Automake产生Makefile 40
3.4 xwpe 45
3.5 shell简介 47
3.6 Perl语言简介 48
3.6.1 安装Perl 49
3.6.2 运行Perl脚本 49
3.7 Tcl和Tk简介 49
3.7.1 Tcl简介 50
3.7.2 Tk简介 50
3.8 awk简介 51
3.8.1 awk的用途 51
3.8.2 awk的特点 51
3.8.3 awk的历史 51
3.9 小结 52
第四章 Linux下常用的文本编辑器 53
4.1 vi简介 53
4.1.1 vi基本观念 53
4.1.2 vi的基本命令 54
4.1.3 vi高级应用 55
4.2 Emacs简介 57
4.2.1 GNU Emacs的特点 57
4.2.2 GNU Emacs的基本用法 58
4.2.3 Emacs小结 64
4.3 Red Hat 6.0中的其他编辑器 64
4.4 小结 65
第五章 Linux核心与系统调用 66
5.1 Linux的核心 66
5.2 系统调用的使用 67
5.3 系统调用与函数的区别 69
5.4 核心程序的结构 69
5.5 小结 70
第六章 内存管理 72
6.1 请求式换页 74
6.2 对换(swapping) 75
6.3 页面的分配与释放 76
6.4 内存映射 76
6.5 共享虚拟内存 77
6.6 缓存 78
6.6.1 Linux的页面缓存 79
6.6.2 交换缓存 79
6.7 用户模式与核心模式的转换 79
6.8 小结 80
第七章 Linux的文件系统 81
7.1 Linux文件系统概述 81
7.2 Ext2文件系统 83
7.3 VFS 88
7.4 /proc文件系统 94
7.5 设备文件 94
7.6 文件操作的系统调用 95
7.6.1 文件描述字 95
7.6.2 open系统调用 95
7.6.3 close系统调用 96
7.6.4 read与write系统调用 96
7.6.5 creat系统调用 97
7.6.6 lseek系统调用 99
7.6.7 dup系统调用 102
7.6.8 link系统调用 104
7.6.9 unlink系统调用 105
7.6.10 fcntl系统调用 105
7.6.11 stat与fstat系统调用 107
7.6.12 access系统调用 112
7.6.13 chmod系统调用 113
7.6.14 chown系统调用 114
7.6.15 chdir系统调用 115
7.6.16 mkdir与rmdir系统调用 115
7.6.17 mknod系统调用 115
7.6.18 mount与umount系统调用 116
7.6.19 ftw系统调用 117
7.6.20 ioctl()系统调用 118
7.7 小结 121
第八章 进程管理 123
8.1 进程的概念 123
8.2 观察进程执行 124
8.3 Linux的进程管理 126
8.3.1 进程ID 128
8.3.2 进程调度 129
8.3.3 文件处理 131
8.3.4 虚拟内存处理 131
8.3.5 创建一个进程 132
8.3.6 执行一个程序 133
8.4 创建进程——fork和clone 133
8.4.1 fork()系统调用 134
8.4.2 system()系统调用 141
8.4.3 clone()系统调用 142
8.5 exec系统调用 143
8.6 进程的优先级 148
8.7 获取/设置进程信息 149
8.7.1 获取进程的PID号 149
8.7.2 获取/设置进程组信息 149
8.8 ptrace()系统调用 150
8.9 Linux的启动过程 151
8.10 小结 161
第九章 进程间通信(IPC) 163
9.1 进程间通信机制简介 163
9.1.1 信号 163
9.1.2 管道 165
9.2 System V IPC机制简介 167
9.2.1 消息队列 168
9.2.2 信号灯(semaphores) 169
9.2.3 共享内存 169
9.3 信号处理 170
9.3.1 信号类型 171
9.3.2 处理信号的系统调用 172
9.4 Linux的管道操作的系统调用 177
9.4.1 pipe()系统调用 177
9.4.2 命名管道 183
9.5 UNIX System V IPC机制 188
9.5.1 System VIPC对象的内容 188
9.5.2 消息队列 189
9.5.3 共享内存 197
9.5.4 信号灯 201
9.6 多进程编程 209
9.6.1 主要程序结构 209
9.6.2 选择主体分叉点 209
9.6.3 进程间关系处理 210
9.6.4 进程间通讯处理 210
9.7 小结 212
第十章 网络编程 214
10.1 TCP/IP简介 214
10.2 Linux中TCP/IP网络的层结构 215
10.3 BSD套接字接口 216
10.4 IP层 217
10.5 地址解析协议(ARP) 218
10.6 网络编程的基本概念 219
10.6.1 网络地址 219
10.6.2 网络端口 221
10.6.3 套接字 221
10.6.4 客户/服务器模式(C/S) 222
10.6.5 阻塞与非阻塞 223
10.7 套接字网络编程原理 223
10.8 网络编程的系统调用 225
10.8.1 面向连接的套接字服务器端程序 227
10.8.2 面向连接的套接字客户端程序 228
10.9 小结 239
第十一章 Linux的多线程编程 240
11.1 简介 240
11.1.1 使用多线程的好处 240
11.1.2 Linux的线程结构 240
11.1.3 Linux线程的缺点 243
11.2 Linux的线程库应用 245
11.2.1 创建线程 245
11.2.2 暂停线程 247
11.2.3 线程同步 249
11.2.4 线程的终止和终止处理程序 257
11.2.5 线程特定数据的处理函数 260
11.2.6 使用信号灯来同步线程 264
11.3 Linux的线程库函数及相关函数 266
11.3.1 处理线程的基本函数 266
11.3.2 线程同步函数 267
11.3.3 线程特定数据的处理函数 269
11.3.4 线程的调度函数 269
11.3.5 线程的属性处理函数 270
11.3.6 流处理函数 273
11.3.7 非标准POSIX线程处理函数 274
11.4 小结 274
第十二章 安全性问题 275
12.1 安全问题概述 275
12.1.1 网络安全 275
12.1.2 网络安全的特征及其分类 276
12.1.3 TCP/IP协议的安全问题 276
12.2 防火墙 277
12.3 程序安全技术 279
12.3.1 涉及安全问题的系统调用 279
12.3.2 标准C库子程序的安全性 281
12.3.3 安全的C程序 283
12.3.4 root程序设计的安全性 284
12.4 Buffer Overflow分析 285
12.5 小结 287
附录A Linux的系统调用 288
附录B Linux的共享库 294
附录C Linux内核源代码结构 297
附录D GNU通用公共许可证(GPL) 301