译者序
前言
第1学时 入门
1.1 Linux简介
1.2 GNU gcc简介
1.2.1 选择GNU标准
1.2.2 指定编译器输出
1.2.3 运行编译后的程序
1.3 用于调试的编译
1.4 检查编译器的警告级别
1.5 处理编译器的警告消息
1.5.1 关于赋值的警告
1.5.2 关于未用参数的警告
1.5.3 解决关于未用变量的警告
1.5.4 解决关于未用字符串的警告
1.6 测试C编译器
1.7 课时小结
1.8 专家答疑
1.9 课外作业
1.9.1 思考题
1.9.2 练习题
第2学时 管理源代码
2.1 使用源代码管理的好处
2.2 有哪些可以选择的工具
2.3 为项目设置RCS
2.4 创建新的源文件
2.5 查看RCS控制的文件
2.6 使用RCS子目录
2.7 签出文件进行编辑
2.8 修改文件
2.9 显示修改的内容
2.10 注册修改
2.11 用rlog命令列出编辑历史记录
2.12 嵌入式替换
2.13 显示嵌入的RCS信息
2.14 使用源文件模板
2.14.1 源代码模板
2.14.2 包含文件模板
2.15 取消锁定的签出
2.16 课时小结
2.17 专家答疑
2.18 课外作业
2.18.1 思考题
2.18.2 练习题
第3学时 编写Linux实用程序
3.1 开始使用项目dos_cvrt
3.1.1 项目规划
3.1.2 签出dos_cvrt.c进行编辑
3.1.3 选择包含文件
3.1.4 利用占位程序编写dos_cvrt
3.1.5 测试带占位程序的实用程序
3.1.6 替换占位程序
3.1.7 回顾整个项目
3.2 使用命令行编辑
3.2.1 选择命令行编辑模式
3.2.2 进行命令行搜索
3.3 课时小结
3.4 专家答疑
3.5 课外作业
3.5.1 思考题
3.5.2 练习题
第4学时 C语言的模块化编程
4.1 模块化编程
4.2 制作模块化的dos_cvrt.c
4.2.1 签出dos_cvrt.c进行编辑
4.2.2 将dos_cvrt.c分解为函数
4.2.3 改善dos_cvrt
4.2.4 将dos_cvrt分解为独立的源程序模块
4.2.5 声明静态函数
4.3 课时小结
4.4 专家答疑
4.5 课外作业
4.5.1 思考题
4.5.2 练习题
第5学时 Make文件简介
5.1 为什么要使用make
5.2 Makefile文件
5.2.1 测试make的内部功能
5.2.2 命名自已的Makefile文件
5.2.3 Makefile的目标文件
5.2.4 默认的目标文件
5.2.5 标准目标文件名称
5.2.6 依赖关系
5.3 定义make的宏
5.3.1 替代宏的值
5.3.2 使用环境变量
5.3.3 使用make的-e选项
5.4 检查文件的后缀
5.5 推理规则
5.5.1 测试默认推理规则
5.5.2 定义推理规则
5.5.3 动作语句
5.5.4 内部宏
5.5.5 宏CFLAGS
5.6 为dos_cvrt使用Makefile文件
5.6.1 生成一个Makefile文件
5.6.2 测试新的Makefile文件
5.6.3 测试局部编译
5.7 课时小结
5.8 专家答疑
5.9 课外作业
5.9.1 思考题
5.9.2 练习题
第6学时 Linux命令行选项处理
6.1 命令行处理简介
6.1.1 命令行约定
6.1.2 使用多个选项
6.1.3 组合多个选项
6.1.4 使用带参数的选项
6.1.5 区分选项和参数
6.2 检查看起来像选项的参数
6.3 getopt()简介
6.4 getopt()函数调用
6.5 回顾函数getopt()的原型
6.5.1 定义optstring参数
6.5.2 定义一个选项处理循环
6.6 使用getopt()改进dos_cvrt
6.7 GNU长选项扩展
6.8 使用GNU函数getop_long()
6.8.1 定义GNU函数getop_long()的原型
6.8.2 理解option结构
6.8.3 设置option结构
6.8.4 使用一个空option.flag指针
6.8.5 使用一个非空option.flag指针
6.9 为dos_cvrt增加GNU长选项
6.10 课时小结
6.11 专家答疑
6.12 课外作业
6.12.1 思考题
6.12.2 练习题
第7学时 错误的处理和报告
7.1 如何处理错误
7.2 UNIX的错误报告
7.2.1 指出成功或错误
7.2.2 判断错误的原因
7.3 旧的errno值
7.3.1 通过名称引用错误代码
7.3.2 测试特殊错误
7.3.3 正确使用errno
7.4 新的errno值
7.4.1 声明新的errno变量
7.4.2 使用新的errno变量
7.5 关于errno值的输出
7.5.1 使用函数perror()
7.5.2 使用数组sys_errlist[]
7.5.3 使用函数strerror()
7.6 改进dos_cvrt使它友好地报告错误
7.6.1 改进模块unix2dos.c
7.6.2 改进模块dos2ix.c
7.6.3 生成模块putch.c
7.6.4 改变包含文件dos_cvrt.h
7.6.5 改进Makefile
7.6.6 改进模块dos_cvrt.c
7.7 测试所有的错误
7.8 课时小结
7.9 专家答疑
7.10 课外作业
7.10.1 思考题
7.10.2 练习题
第8学时 Linux的main程序及其环境
8.1 main程序接口
8.1.1 组织数组argv[]
8.1.2 使用不带argc的argv[]
8.1.3 声明第三个main()参数
8.1.4 传递外壳的外部变量
8.1.5 使用外部指针environ
8.2 Linux程序的地址空间
8.3 环境操作
8.3.1 获取一个环境变量
8.3.2 改变环境变量
8.3.3 删除环境变量的定义
8.3.4 理解环境变化的影响
8.4 进程出口值
8.4.1 退出代码处理
8.4.2 返回一个值
8.4.3 使用exit()函数
8.4.4 在return和exit()之间选择
8.4.5 使用关于return语句的编译器警告
8.5 课时小结
8.6 专家答疑
8.7 课外作业
8.7.1 思考题
8.7.2 练习题
第9学时 有用的调试技术
9.1 调试技术简介
9.2 调试器的限制
9.3 用C宏进行跟踪
9.3.1 定义一个TRACE宏
9.3.2 改进TRACE宏
9.3.3 定义一个参数数量可变的TRACEF
9.3.4 定义有条件的调试宏
9.4 运行阶段调试跟踪功能
9.4.1 用命令行选项控制TRACE
9.4.2 使用调试级别
9.4.3 通过环境变量来设置调试级别
9.5 设计子系统跟踪功能
9.5.1 编写子系统跟踪功能
9.5.2 子系统跟踪总结
9.6 课时小结
9.7 专家答疑
9.8 课外作业
9.8.1 思考题
9.8.2 练习题
第10学时 静态和共享函数库
10.1 C函数库简介
10.2 静态函数库
10.2.1 回顾进程内存映像
10.2.2 实现一个静态函数库
10.2.3 使用ar命令来生成档案
10.2.4 列出档案的内容
10.2.5 链接静态函数库
10.3 共享函数库
10.3.1 静态函数库的限制
10.3.2 生成一个共享函数库
10.3.3 链接共享函数库
10.3.4 列出共享函数库的引用
10.3.5 使用动态装载器
10.3.6 独立于代码的编译位置
10.3.7 控制共享的内容
10.4 函数库的含义
10.4.1 静态函数库的优点
10.4.2 共享函数库的优点
10.5 何时该使用静态或共享函数库
10.5.1 许可证号
10.5.2 安装可靠
10.5.3 为了节省而共享
10.5.4 动态装载
10.6 课时小结
10.7 专家答疑
10.8 课外作业
10.8.1 思考题
10.8.2 练习题
第11学时 高级字符串函数
11.1 高级字符串函数简介
11.2 包含字符串函数声明
11.3 函数strcasecmp()和strncasecmp()
11.3.1 测试一个命令名称匹配的例子
11.3.2 比较前n个字符
11.3.3 解释返回值
11.4 函数strdup()
11.4.1 释放字符串
11.4.2 测试错误
11.5 函数strchr()和strrchr()
11.6 函数strpbrk()
11.7 函数strspn()和strcspn()
11.8 函数strstr()
11.9 函数strtok()和strtok_r()
11.9.1 函数strtok()
11.9.2 分解一个命令行
11.9.3 函数strtok_r()
11.9.4 strtok()的限制
11.9.5 保存状态
11.9.6 介绍strtok_r()函数
11.10 字符串使用技巧
11.10.1 优化strcat()和strcpy()调用
11.10.2 有效地使用strncpy()返回值
11.10.3 临时编写sprintfcat()函数
11.11 课时小结
11.12 专家答疑
11.13 课外作业
11.13.1 思考题
11.13.2 练习题
第12学时 转换函数
12.1 转换函数简介
12.2 系列函数atoi()、atol()和atof()
12.2.1 详细考察函数atoi()和atol()
12.2.2 使用atof()函数
12.3 为转换和有效性使用sscanf()
12.3.1 将sscanf()用于数字转换
12.3.2 测试使用sscanf()的数值转换
12.3.3 改善sscanf()转换
12.3.4 考虑sscanf()的限制
12.4 函数strtol()和strtoul()
12.4.1 使用函数strtol()
12.4.2 测试函数strtol()
12.4.3 测试错误
12.4.4 测试转换指针
12.4.5 执行多个转换
12.4.6 理解基数转换
12.4.7 测试上溢和下溢
12.4.8 对strtoul()上溢的测试
12.5 函数strtod()
12.5.1 使用函数strtod()
12.5.2 测试数学错误
12.6 课时小结
12.7 专家答疑
12.8 课外作业
12.8.1 思考题
12.8.2 练习题
第13学时 Linux的日期和时间功能
13.1 日期和时间支持功能简介
13.2 Epoch时间简介
13.3 理解当前的Linux日期和时间
13.3.1 定义日期和时间数据类型
13.3.2 理解为什么时间在运行
13.3.3 发现time_t数据类型
13.3.4 使用time()获得日期和时间
13.4 使用时间转换函数
13.4.1 函数ctime()
13.4.2 函数localtime()和gmtime()
13.4.3 tm结构
13.4.4 函数asctime()
13.4.5 函数tzset()
13.4.6 函数mktime()
13.5 定制日期和时间格式
13.6 课时小结
13.7 专家答疑
13.8 课外作业
13.8.1 思考题
13.8.2 练习题
第14学时 用户ID、密码和组管理
14.1 简单介绍Linux的管理
14.1.1 用户名和uid编号
14.1.2 组名和gid编号
14.2 身份函数
14.2.1 getuid()和geteuid()函数
14.2.2 getgid()和getegid()函数
14.2.3 uid和gid编号示例
14.3 /etc/passwd文件
14.3.1 注释域
14.3.2 在注释域中使用&
14.3.3 搜索密码数据库
14.4 密码数据库例程
14.4.1 passwd结构
14.4.2 处理getpwent()函数的错误
14.4.3 fgetpwent()函数
14.4.4 putpwent()函数
14.4.5 getpwuid()函数
14.4.6 getpwnam()函数
14.5 组数据库
14.5.1 /etc/group文件
14.5.2 getgrent()、setgrent()和endgrent()函数
14.5.3 group结构
14.5.4 fgetgrent()函数
14.5.5 getgrgid()函数
14.5.6 getgrnam()函数
14.6 课时小结
14.7 专家答疑
14.8 课外作业
14.8.1 思考题
14.8.2 练习题
第15学时 文件系统信息和管理
15.1 基本的文件操作
15.1.1 删除文件
15.1.2 链接文件
15.1.3 移动文件
15.2 目录操作
15.2.1 得到当前的工作目录
15.2.2 改变目录
15.2.3 创建新目录
15.2.4 删除目录
15.3 设置umask值
15.3.1 为什么要用umask
15.3.2 umask的作用范围
15.3.3 使用umask()函数
15.4 理解文件系统信息
15.5 课时小结
15.6 专家答疑
15.7 课外作业
15.7.1 思考题
15.7.2 练习题
第16学时 临时文件和进程清理
16.1 生成临时文件名
16.1.1 调用tmpnam()函数
16.1.2 调用mkstemp()函数
16.1.3 调用tmpfile()函数
16.1.4 调用tempnam()函数
16.1.5 解释临时文件函数的错误
16.2 将文件设为临时文件
16.2.1 调用unlink()函数将文件设为临时文件
16.2.2 退出之前的清理
16.3 课时小结
16.4 专家答疑
16.5 课外作业
16.5.1 思考题
16.5.2 练习题
第17学时 管道和进程
17.1 使用外部进程
17.2 管道简介
17.2.1 打开管道
17.2.2 读管道
17.2.3 写管道
17.2.4 关闭管道
17.2.5 处理断开的管道
17.3 system()函数简介
17.3.1 system()函数的返回值
17.3.2 调用system()函数
17.3.3 运行程序示例
17.3.4 对system()函数的评价
17.4 课时小结
17.5 专家答疑
17.6 课外作业
17.6.1 思考题
17.6.2 练习题
第18学时 派生进程
18.1 进程简介
18.1.1 进程ID号
18.1.2 父进程和子进程
18.1.3 创建进程
18.2 fork()函数
18.2.1 调用fork()函数
18.2.2 运行fork()函数示例
18.3 wait()函数族
18.3.1 wait()函数的重要性
18.3.2 调用wait()函数
18.3.3 wait函数族中的其他函数
18.4 exec()函数族
18.4.1 exec()过程
18.4.2 联合fork()函数和exec()函数
18.4.3 调用exec()函数
18.4.4 exec()函数族中的其他函数
18.5 课时小结
18.6 专家答疑
18.7 课外作业
18.7.1 思考题
18.7.2 练习题
第19学时 信号量
19.1 信号量简介
19.1.1 和单淋浴间的类比
19.1.2 和多淋浴间的类比
19.1.3 使用Linux信号量
19.1.4 等待信号量
19.1.5 通知信号量
19.1.6 等待多个实例
19.2 创建和访问信号量集
19.2.1 标识已存在的信号量集
19.2.2 调用semget()函数来创建和访问信号量集
19.2.3 初始化信号量集
19.3 等待和通知信号量集
19.3.1 等待信号量集
19.3.2 通知信号量集
19.4 释放信号量占用的系统资源
19.4.1 删除信号量集
19.4.2 使用iPcrm命令释放信号量
19.5 模拟使用信号量
19.6 课时小结
19.7 专家答疑
19.8 课外作业
19.8.1 思考题
19.8.2 练习题
第20学时 共享内存
20.1 为什么需要共享内存
20.2 标识共享内存
20.3 创建、连接和释放共享内存
20.3.1 创建新的共享内存
20.3.2 连接共享内存
20.3.3 在指定的地址连接
20.3.4 分离共享内存
20.3.5 释放共享内存
20.4 使用共享内存
20.4.1 安全访问共享内存
20.4.2 直接引用共享内存而不用信号量
20.5 将共享内存应用到一个游戏中
20.5.1 回顾战舰游戏
20.5.2 玩家指令
20.5.3 分析玩家1的代码
20.5.4 分析玩家2的代码
20.5.5 查看其他重要的源模块
20.6 课时小结
20.7 专家答疑
20.8 课外作业
20.8.1 思考题
20.8.2 练习题
第21学时 消息队列
21.1 消息队列简介
21.1.1 Linux消息队列
21.1.2 应用消息类型
21.1.3 相互竞争的接收者
21.2 管理消息队列
21.2.1 创建和访问消息队列
21.2.2 释放消息队列
21.2.3 消息的结构
21.2.4 指定消息的大小
21.2.5 发送消息
21.2.6 接收消息
21.3 呼叫服务器
21.4 课时小结
21.5 专家答疑
21.6 课外作业
21.6.1 思考题
21.6.2 练习题
第22学时 信号
22.1 什么是信号
22.2 信号SIGINT
22.3 信号的术语
22.4 可靠的和不可靠的信号
22.5 使用信号集
22.5.1 清空信号集
22.5.2 填充信号集
22.5.3 向信号集中添加信号
22.5.4 从信号集中删除信号
22.5.5 测试信号集中的信号
22.6 设置信号响应
22.7 捕获信号
22.8 封锁和解锁信号
22.9 得到挂起的信号
22.10 调用sigsuspend()函数
22.11 调用alarm()函数
22.12 高级信号技术
22.12.1 从信号处理程序中调用函数
22.12.2 避免可重入代码问题
22.12.3 在信号处理程序中处理errno
22.12.4 处理EINTR错误
22.13 常用的Linux信号
22.14 引发Linux信号
22.15 课时小结
22.16 专家答疑
22.17 课外作业
22.17.1 思考题
22.17.2 练习题
第23学时 客户/服务器编程
23.1 客户/服务器的优点
23.2 设计TQL服务器
23.2.1 编译TQL项目
23.2.2 使用TQL命令行选项
23.2.3 检查TQL的环境变量
23.3 理解SQL
23.3.1 使用SELECT命令
23.3.2 使用表和列
23.3.3 第一次启动TQL
23.3.4 选择特定的列
23.3.5 选择特定的行
23.3.6 对行进行排序
23.4 分析TQL的源代码
23.4.1 分析表代码
23.4.2 在tqld中处理信号
23.4.3 分析排序模块
23.4.4 执行sort命令
23.5 课时小结
23.6 专家答疑
23.7 课外作业
23.7.1 思考题
23.7.2 练习题
第24学时 使用帮助页
24.1 介绍man命令
24.1.1 使用man命令
24.1.2 探索节的内容
24.1.3 找到帮助页
24.1.4 调试帮助页
24.1.5 解决与文档的冲突
24.1.6 查看ERRORS部分
24.1.7 查看SEE ALSO部分
24.1.8 查找文件
24.1.9 有文档记录的错误
24.2 课时小结
24.3 展望未来
24.4 专家答疑
24.5 课外作业
24.5.1 思考题
24.5.2 练习题
附录 思考题答案