第1章 Linux的定义
1.1 计算机系统 1
1.2 硬件 2
1.2.1 中央处理器(CPU) 2
1.2.2 总线 2
1.2.3 随机存储器(RAM) 3
1.2.4 只读存储器(ROM) 3
1.2.5 外存储器 3
1.2.6 光驱 3
1.2.7 显示器 3
1.2.8 图形卡 3
1.2.9 键盘 3
1.2.10 鼠标 3
1.2.11 打印机 3
1.2.12 磁带 3
1.2.13 调制解调器 4
1.2.14 网络接口 4
1.2.15 其他外围设备 4
1.3 操作系统 4
1.4 软件 4
1.5 共享资源 5
1.6 通信 5
1.7 实用程序 6
1.8 程序员支持 6
1.9 标准 7
1.10 Linux家族 7
1.10.1 UNIX 7
1.10.2 开源软件和自由软件基金 9
1.10.3 Linus 9
1.11 Linux的软件打包 10
1.12 Linux和UNIX的基本方法 10
1.13 Linux的特性 11
1.14 本书内容展望 12
第2章 安装Linux系统
2.1 引言 14
2.2 支持Linux的硬件 15
2.2.1 CPU类型 15
2.2.2 总线结构 15
2.2.3 内存 15
2.2.4 磁盘 16
2.2.5 显示器、键盘和鼠标 16
2.3 选择Linux分发版 16
2.3.1 Debian 17
2.3.2 Fedora 17
2.3.3 Mandrake 18
2.3.4 Slackware 18
2.3.5 SuSe 19
2.3.6 TurboLinux 19
2.4 选择软件包 19
2.4.1 X Window系统 19
2.4.2 桌面环境 20
2.4.3 联网 21
2.4.4 Office工具 22
2.4.5 编程语言和工具 22
2.5 设计系统 22
2.5.1 运行Linux的方式 23
2.5.2 磁盘分区 23
2.5.3 Linux文件系统 24
2.5.4 引导加载程序 26
2.5.5 引导软盘 26
2.6 获得Linux 27
2.6.1 光盘 27
2.6.2 下载 28
2.7 安装Linux 28
2.7.1 获得Linux分发版的文档 28
2.7.2 引导 29
2.7.3 分区工具 29
2.7.4 重新设置Windows分区的大小 30
2.7.5 系统设置 30
2.7.6 引导加载程序 31
第3章 非程序员使用的GNU实用程序
3.1 获得账户 34
3.2 登录 34
3.3 Shells 35
3.4 运行GNU实用程序 35
3.5 输入、输出和错误通道 36
3.6 获得联机帮助:man 36
3.7 特殊字符 38
3.7.1 终止进程:Control-C 39
3.7.2 输入结束:Control-D 39
3.8 设置密码:passwd 39
3.9 登出 40
3.10 浏览文件系统 41
3.11 打印shell的当前工作目录:pwd 41
3.12 绝对路径名和相对路径名 42
3.13 创建文件 43
3.14 列出目录内容:ls 44
3.15 列出文件的内容:cat/more/head/tail 45
3.16 重命名文件:mv 46
3.17 创建目录:mkdir 46
3.18 切换目录:cd 47
3.19 复制文件:cp 48
3.20 编辑文件:vim 49
3.21 删除目录:rmdir 49
3.22 删除文件:rm 50
3.23 打印文件:lp/lpstat/cancel 51
3.24 打印文件:lpr/lpq/lprm 52
3.25 计算文件字数:wc 54
3.26 文件属性 54
3.26.1 文件存储空间 54
3.26.2 文件名 55
3.26.3 文件修改时间 55
3.26.4 文件所有者 55
3.26.5 文件组 55
3.26.6 文件类型 55
3.26.7 文件权限 56
3.26.8 硬链接数 58
3.27 组 58
3.28 列出组:groups 58
3.29 改变文件组:chgrp 59
3.30 修改文件权限:chmod 59
3.31 改变文件所有者:chown 61
3.32 改变组:newgrp 61
3.33 尾声 62
3.34 确定终端类型:tset 62
3.35 改变终端的特性:stty 64
3.36 编辑文件:vim 66
3.36.1 启动vim 66
3.36.2 文本输入模式 66
3.36.3 命令模式 67
3.36.4 内存缓冲区和临时文件 68
3.36.5 常见的编辑功能 68
3.36.6 光标移动 68
3.36.7 删除文本 69
3.36.8 替换文本 70
3.36.9 粘贴文本 70
3.36.10 查找 71
3.36.11 查找/替换 72
3.36.12 保存/加载文件 72
3.36.13 其他操作 73
3.36.14 自定义vim 73
3.36.15 保存自定义设置 74
3.37 编辑文件:emacs 74
3.37.1 启动emacs 74
3.37.2 emacs命令 75
3.37.3 脱困 75
3.37.4 获得帮助 76
3.37.5 退出emacs 76
3.37.6 emacs的模式 76
3.37.7 输入文本 76
3.37.8 常见编辑功能 76
3.37.9 移动光标 76
3.37.10 删除、粘贴和撤销 77
3.37.11 查找 78
3.37.12 查找/替换 78
3.37.13 保存/加载文件 78
3.37.14 其他操作 79
3.38 电子邮件:mail 79
3.38.1 发邮件 80
3.38.2 读邮件 81
3.38.3 联系系统管理员 82
第4章 特权用户使用的GNU实用程序
4.1 引言 85
4.2 过滤文件:egrep,fgrep,grep,uniq 86
4.2.1 过滤模式:egrep/fgrep/grep 86
4.2.2 删除重复行:uniq 89
4.3 排序文件:sort 90
4.4 比较文件:cmp和diff 92
4.4.1 测试同一性:cmp 92
4.4.2 文件差异:diff 93
4.5 查找文件:find 94
4.6 归档文件:cpio,tar和dump/restore 96
4.6.1 复制文件:cpio 96
4.6.2 磁带归档:tar 98
4.6.3 增量备份:dump和restore 100
4.7 调度命令:crontab和at 101
4.7.1 定期执行:crontab 102
4.7.2 一次性执行:at 103
4.8 可编程的文本处理:gawk 105
4.8.1 gawk程序 105
4.8.2 访问单个的域 106
4.8.3 BEGIN和END 106
4.8.4 运算符 107
4.8.5 变量 107
4.8.6 控制结构 107
4.8.7 扩展的正则表达式 108
4.8.8 条件范围 108
4.8.9 域分隔符 108
4.8.10 内建函数 109
4.9 硬链接和软链接:ln 109
4.10 标识shell:whoami 111
4.11 替换用户:su 111
4.12 转换文件 112
4.12.1 压缩文件:gzip和gunzip 112
4.12.2 流编辑:sed 113
4.12.3 转换字符:tr 117
4.12.4 转换下划线序列:ul 118
4.13 查看原始文件内容:od 118
4.14 挂接文件系统:mount和umount 120
4.15 标识终端:tty 120
4.16 测试执行时间:time 121
4.17 自己编写程序:perl 121
4.17.1 获得Perl 122
4.17.2 运行Perl 122
4.17.3 打印文本 122
4.17.4 变量、字符串和整数 123
4.17.5 数组 123
4.17.6 算术和逻辑运算符 125
4.17.7 字符串运算符 126
4.17.8 比较运算符 126
4.17.9 if,while和foreach循环结构 126
4.17.10 文件 127
4.17.11 函数 128
4.17.12 库函数 128
4.17.13 命令行参数 129
4.17.14 现实世界的例子 130
第5章 Linux shell
5.1 引言 135
5.2 选择shell 135
5.3 shell操作 136
5.4 可执行文件对内建命令 137
5.4.1 显示信息:echo 137
5.4.2 切换目录:cd 137
5.5 元字符 137
5.6 重定向 138
5.6.1 输出重定向 138
5.6.2 输入重定向 139
5.7 文件名替换(通配符) 140
5.8 命令替换 142
5.9 序列 143
5.10 组合命令 144
5.11 后台处理 144
5.12 重定向后台进程 145
5.13 shell程序(脚本) 146
5.14 子shell 147
5.15 变量 148
5.16 引用 150
5.17 here文档 150
5.18 作业控制 151
5.18.1 进程状态:ps 151
5.18.2 向进程发送信号:kill 154
5.18.3 等待子进程:wait 155
5.19 查找命令:$PATH 156
5.20 替换标准实用程序 157
5.21 终止和退出码 157
5.22 通用的核心内建命令 158
5.22.1 eval 158
5.22.2 exec 159
5.22.3 shift 159
5.22.4 umask 159
第6章 Bourne Again shell
6.1 引言 164
6.2 启动 164
6.3 变量 164
6.3.1 简单变量的创建/赋值 165
6.3.2 访问简单变量 166
6.3.3 列表变量的创建/赋值 167
6.3.4 访问列表变量 168
6.3.5 建立列表 168
6.3.6 摧毁列表 169
6.3.7 从标准输入读取变量 169
6.3.8 导出变量 170
6.3.9 只读变量 171
6.3.10 预定义变量 172
6.4 命令的快捷方式 173
6.4.1 别名 174
6.4.2 命令历史 174
6.4.3 命令补全 176
6.5 代字号替换 176
6.6 重定向 177
6.7 命令替换 178
6.8 算术运算 178
6.9 条件表达式 179
6.9.1 算术测试 179
6.9.2 字符串比较 179
6.9.3 面向文件的表达式 180
6.10 控制结构 180
6.10.1 case..in..esac 181
6.10.2 if..then..elif..then..else..fi 182
6.10.3 for..do..done 183
6.10.4 while/until..do..done 184
6.10.5 trap 185
6.11 函数 186
6.11.1 使用参数 186
6.11.2 从函数返回 187
6.11.3 访问函数 187
6.11.4 递归 188
6.11.5 共享函数 189
6.12 菜单:select 189
6.13 目录访问和目录堆栈 190
6.14 作业控制 192
6.14.1 指定作业 192
6.14.2 bg 192
6.14.3 fg 193
6.14.4 kill 193
6.15 命令行选项 193
第7章 Korn shell
7.1 引言 196
7.2 启动 197
7.3 变量 198
7.3.1 变量的创建/赋值 198
7.3.2 访问变量 199
7.3.3 从标准输入读取变量 200
7.3.4 导出变量 201
7.3.5 只读变量 202
7.3.6 预定义的局部变量 202
7.3.7 预定义的环境变量 203
7.4 别名 204
7.4.1 给内建命令指定别名 204
7.4.2 删除别名 204
7.4.3 预定义的别名 205
7.4.4 几个有用的别名 205
7.4.5 被跟踪的别名 205
7.4.6 共享别名 206
7.5 历史 207
7.5.1 命令的编号 207
7.5.2 命令的存储 207
7.5.3 命令重执行 207
7.5.4 编辑命令 208
7.6 编辑命令 209
7.6.1 内建的vi编辑器 209
7.6.2 内建的emacs/gmacs编辑器 211
7.7 算术运算 211
7.7.1 防止元字符的特殊解释 212
7.7.2 测试值 213
7.8 代字号替换 213
7.9 菜单:select 214
7.10 函数 215
7.10.1 使用参数 216
7.10.2 从函数返回 216
7.10.3 上下文 217
7.10.4 局部变量 217
7.10.5 递归 217
7.10.6 共享函数 218
7.11 作业控制 218
7.11.1 jobs 219
7.11.2 指定作业 219
7.11.3 bg 220
7.11.4 fg 220
7.11.5 kill 220
7.12 增强功能 221
7.12.1 重定向 221
7.12.2 管道 222
7.12.3 命令替换 222
7.12.4 变量 222
7.12.5 内建命令 227
7.13 示范项目:junk 232
7.14 命令行选项 234
第8章 C shell
8.1 引言 238
8.2 启动 238
8.3 变量 239
8.3.1 简单变量的创建/赋值 239
8.3.2 访问简单变量 240
8.3.3 列表变量的创建/赋值 240
8.3.4 访问列表变量 241
8.3.5 建立列表 241
8.3.6 预定义局部变量 242
8.3.7 环境变量的创建/赋值 243
8.3.8 预定义的环境变量 243
8.4 表达式 243
8.4.1 字符串表达式 243
8.4.2 算术表达式 244
8.4.3 面向文件的表达式 245
8.5 文件名补全 246
8.6 命令编辑 246
8.7 别名 247
8.7.1 删除别名 248
8.7.2 有用的别名 248
8.7.3 共享别名 248
8.7.4 带参数的别名 248
8.8 历史 249
8.8.1 命令的编号 249
8.8.2 命令的存储 249
8.8.3 读取历史 249
8.8.4 命令重执行 250
8.8.5 访问历史的某个部分 250
8.8.6 访问文件名的某个部分 251
8.8.7 历史替换 252
8.9 控制结构 252
8.9.1 foreach..end 253
8.9.2 goto 253
8.9.3 if..then..else..endif 254
8.9.4 onintr 255
8.9.5 repeat 255
8.9.6 switch..case..endsw 256
8.9.7 while..end 257
8.10 示例项目:junk 258
8.11 增强功能 260
8.11.1 元字符:{} 260
8.11.2 文件名替换 261
8.11.3 重定向 261
8.11.4 管道 262
8.11.5 作业控制 262
8.11.6 终止登录shell 264
8.12 内建命令 264
8.12.1 chdir 264
8.12.2 glob 265
8.12.3 source 265
8.13 目录堆栈 265
8.14 命令行选项 267
第9章 联网与Internet
9.1 引言 270
9.2 组网 270
9.2.1 以太网 270
9.2.2 网桥 271
9.2.3 路由器 271
9.2.4 网关 272
9.3 网络互联 272
9.3.1 包交换 273
9.3.2 IP地址 273
9.3.3 命名 274
9.3.4 路由 274
9.3.5 安全 274
9.3.6 端口和常见服务 276
9.3.7 网络编程 276
9.4 标识网络用户 276
9.4.1 列出用户:users 277
9.4.2 更详细的用户列表:who和w 277
9.4.3 本地主机名:hostname 278
9.4.4 个人数据:finger 278
9.5 与网络用户通信 279
9.5.1 屏蔽通信:mesg 279
9.5.2 一次发送一行文本:write 279
9.5.3 互动交谈:talk 280
9.5.4 把消息发送给所有用户:wall 280
9.6 分发数据 281
9.6.1 在两台Linux或UNIX主机间复制文件:rcp和scp 281
9.6.2 在非Linux/UNIX主机间复制文件:ftp和sftp 282
9.7 分布式处理 284
9.7.1 远程登录:rlogin和slogin 284
9.7.2 执行远程命令:rsh和ssh 285
9.7.3 远程连接:telnet 285
9.8 Internet的演变 287
9.8.1 开端——20世纪60年代 288
9.8.2 Intenet的标准化——20世纪
70年代 288
9.8.3 重新架构和重新命名Internet--
20世纪90年代 290
9.8.4 web--20世纪90年代 293
9.9 使用当今的Internet 297
9.9.1 URL 297
9.9.2 web搜索 297
9.9.3 查找用户和域 298
第10章 Linux桌面
10.1 引言 300
10.1.1 图形用户界面 301
10.1.2 MIT 301
10.2 X服务器 301
10.2.1 屏幕几何学 302
10.2.2 安全性和授权 302
10.3 桌面环境 303
10.3.1 CDE 304
10.3.2 GNOME 304
10.3.3 KDE 304
10.4 窗口管理器 305
10.4.1 焦点 305
10.4.2 程序启动 305
10.4.3 打开和关闭窗口 306
10.4.4 选择 306
10.5 控件 308
10.5.1 菜单 308
10.5.2 按钮 309
10.5.3 复选框/单选按钮 309
10.5.4 滚动条 309
10.6 桌面操作 310
10.6.1 弹出根菜单 310
10.6.2 打开和关闭窗口 310
10.6.3 最小化窗口 310
10.6.4 最大化窗口 311
10.6.5 移动窗口 311
10.6.6 重新调整窗口大小 311
10.6.7 升起或降低窗口 311
10.6.8 弹出窗口菜单 311
10.7 客户端应用程序 311
10.7.1 xclock 311
10.7.2 xterm 312
10.8 X客户端的标准参数 312
10.8.1 几何学 312
10.8.2 前景和背景 313
10.8.3 标题 313
10.8.4 iconic 313
10.9 高级话题 313
10.9.1 复制和粘贴 313
10.9.2 联网功能 314
10.9.3 应用程序资源 315
第11章 C编程工具
11.1 C语言 318
11.2 C编译器 319
11.3 单模块程序 319
11.3.1 编译C程序 320
11.3.2 修改的程序清单 321
11.3.3 运行C程序 321
11.3.4 覆盖默认的可执行文件名 322
11.4 多模块程序 322
11.4.1 可重用的函数 322
11.4.2 创建可重用的函数 322
11.4.3 分别编译和连接模块 324
11.4.4 重用反向函数 324
11.5 归档模块:ar 325
11.5.1 创建或添加文件 326
11.5.2 追加文件 326
11.5.3 获得内容表 326
11.5.4 删除文件 327
11.5.5 抽取文件 327
11.5.6 从命令行维护归档 327
11.5.7 建立归档索引 328
11.5.8 共享库 328
11.6 管理依赖性:make 328
11.6.1 makefile 329
11.6.2 make规则的次序 330
11.6.3 运行make 330
11.6.4 make规则 331
11.6.5 强制编译 332
11.6.6 宏 332
11.6.7 使用make维护归档 333
11.6.8 make的其他功能 334
11.7 GNU分析器:gprof 334
11.8 调试器:gdb 335
11.8.1 准备程序进行调试 336
11.8.2 进入调试器 336
11.8.3 运行程序 337
11.8.4 列出程序 338
11.8.5 设置断点 339
11.8.6 单步执行代码 341
11.8.7 检查变量值 341
11.8.8 问题所在 342
11.9 移除特殊代码:strip 343
第12章 系统编程
12.1 引言 346
12.2 错误处理:perror() 347
12.3 普通文件的管理 349
12.3.1 文件管理基础知识 349
12.3.2 第一个例子:reverse 350
12.3.3 reverse的工作原理 351
12.3.4 reverse.c:程序清单 352
12.3.5 打开文件:open() 356
12.3.6 读文件:read() 357
12.3.7 写文件:write() 358
12.3.8 在文件中移动:lseek() 359
12.3.9 关闭文件:close() 360
12.3.10 删除文件:unlink() 360
12.3.11 第二个例子:monitor 361
12.3.12 monitor的工作方式 362
12.3.13 monitor.c:清单 362
12.3.14 获得文件信息:stat() 369
12.3.15 读目录信息:opendir(),readdir()和closedir() 370
12.3.16 其他各种文件管理系统调用 371
12.3.17 改变文件所有者/文件组:chown() 371
12.3.18 修改文件权限:chmod() 372
12.3.19 复制文件描述符:dup() 372
12.3.20 文件描述符操作:fcntl() 373
12.3.21 控制设备:ioctl() 374
12.3.22 创建硬链接:link() 375
12.3.23 创建特殊文件:mknod(),mkdir()和mkfifo() 376
12.3.24 清空文件系统缓冲区:sync() 376
12.3.25 截短文件:truncate() 377
12.4 进程管理 377
12.4.1 创建新进程:fork() 378
12.4.2 孤儿进程 380
12.4.3 终止进程:exit() 381
12.4.4 僵尸进程 382
12.4.5 等待子进程:wait() 382
12.4.6 区分进程:exec 383
12.4.7 改变目录:chdir() 384
12.4.8 改变优先级:nice() 385
12.4.9 访问用户ID和组ID 386
12.4.10 示例程序:后台处理 386
12.4.11 重定向 387
12.5 信号 388
12.5.1 信号类型 389
12.5.2 定义的信号 389
12.5.3 POSIX信号 389
12.5.4 终端信号 390
12.5.5 请求闹钟信号:alarm() 390
12.5.6 处理信号:signal() 390
12.5.7 保护关键代码,束缚中断处理程序 392
12.5.8 发送信号:kill() 392
12.5.9 子进程的死亡 393
12.5.10 挂起和恢复进程 394
12.5.11 进程组和控制终端 395
12.6 进程间通信 399
12.6.1 管道 399
12.6.2 套接字 405
第13章 Linux内核
13.1 引言 425
13.2 内核基本 426
13.2.1 内核子系统 426
13.2.2 进程和文件 427
13.2.3 和内核交流 427
13.2.4 系统调用 427
13.2.5 用户模式和内核模式 428
13.2.6 同步与非同步处理 429
13.2.7 对中断的中断 431
13.3 文件系统 431
13.3.1 磁盘架构 431
13.3.2 虚拟文件系统 434
13.3.3 i节点 434
13.3.4 文件系统的布局 436
13.3.5 坏块 437
13.3.6 目录 438
13.3.7 把路径名转换为i节点号 438
13.3.8 挂接文件系统 439
13.4 进程管理 440
13.4.1 可执行文件 440
13.4.2 第一批进程 441
13.4.3 内核进程和用户进程 441
13.4.4 进程层次结构 441
13.4.5 进程状态 441
13.4.6 处理内核数据 442
13.4.7 任务列表 443
13.4.8 调度程序 444
13.5 虚拟内存 444
13.5.1 页表 444
13.5.2 调页 445
13.5.3 内存-映射文件 445
13.5.4 交换 446
13.5.5 分配和收回 446
13.5.6 加载可执行文件:execl()/execv() 447
13.5.7 复制进程:fork() 447
13.6 输入和输出 447
13.6.1 I/O对象 448
13.6.2 I/O系统调用 448
13.6.3 I/O缓冲 448
13.6.4 普通文件I/O 449
13.6.5 目录文件I/O 451
13.6.6 挂接文件系统 452
13.6.7 文件名的转换 452
13.6.8 特殊文件I/O 453
13.7 进程间通信 455
13.7.1 信号 455
13.7.2 管道 457
13.7.3 套接字 458
第14章 系统管理
14.1 引言 462
14.2 成为超级用户 462
14.2.1 使用su 462
14.2.2 使用sudo 462
14.3 启动Linux 463
14.3.1 Linux内核 463
14.3.2 运行级别 464
14.3.3 init 464
14.3.4 引导脚本 464
14.4 停止Linux 465
14.5 维护文件系统 465
14.5.1 文件系统的完整性 465
14.5.2 磁盘空间 466
14.5.3 创建新的文件系统 467
14.5.4 备份文件系统 468
14.6 维护用户账户 468
14.6.1 密码文件 469
14.6.2 组文件 470
14.7 安装新软件 470
14.8 外部设备 471
14.9 网络接口 472
14.10 自动执行任务 472
14.11 可调优的内核参数 473
14.11.1 /proc文件系统 473
14.11.2 sysctl实用程序 474
14.12 安全性问题 474
附录A 正则表达式与系统函数
A.1 正则表达式 477
A.1.1 文本 477
A.1.2 模式 478
A.2 扩展的正则表达式 478
A.3 修改的Backus-Naur符号 479
A.4 实用程序和内建的shell命令 480
A.5 系统调用和库函数 484
附录B 参考文献