第1篇 基础篇 3
第1章 Linux 系统和 C 语言简介 3
1.1 Linux 系统简介 4
1.1.1 Linux 系统的发展简介 4
1.1.2 Linux 系统的主要优异性能 5
1.1.3 Linux 系统的主要构成 5
1.1.4 现行 Linux 系统的主要版本 6
1.2 C 语言简介 6
1.2.1 C 语言概述 6
1.2.2 数据类型 7
1.2.3 运算符和表达式 15
1.2.4 C 程序语句 16
1.2.5 函数 22
1.2.6 编译预处理 23
1.3 Linux 平台下 C 程序的开发 25
1.3.1 在 UNIX 操作系统下运行 C 程序的步骤 25
1.3.2 用 Turbo C 运行 C 程序的步骤 25
1.3.3 Linux 平台下 C 程序的开发 25
1.4 小结与练习 26
1.4.1 小结 26
1.4.2 习题与思考 26
第2章 Emacs 编辑器 27
2.1 Emacs 简介 28
2.1.1 Emacs 编辑器的运行和结束 28
2.1.2 基本操作 28
2.2 C 模式 30
2.2.1 自动缩进 30
2.2.5 使用 Emacs 进行编译和调试 31
2.2.4 自动状态 31
2.2.2 注释 31
2.2.3 预处理扩展 31
2.3 小结与练习 32
2.3.1 小结 32
2.3.2 习题与思考 32
第3章 C 语言编译器 gcc 35
3.1 gcc 的使用 36
3.1.1 一个最基本的实例 36
3.1.2 gcc 的用法 37
3.1.3 警告 40
3.1.4 优化 gcc 41
3.1.5 调试标记 46
3.1.6 使用高级 gcc 选项 48
3.2.2 GUN 连接器 ld 51
3.2.3 GUN 汇编器 as 51
3.2.1 C 预处理器 cpp 51
3.2 gcc 编译流程简介 51
3.2.4 文件处理器 ar 52
3.2.5 库显示 ldd 52
3.3 其他编译调试工具 52
3.3.1 C++编译器 g++ 52
3.3.2 EGCS 52
3.3.3 calls 53
3.3.4 indent 53
3.3.5 gprof 53
3.3.6 f2c 和 p2c 53
3.4 小结与练习 53
3.4.1 小结 53
3.4.2 习题与思考 54
第4章 调试工具 gdb 55
4.1 gdb 符号调试器简介 56
4.2.1 调试步骤 57
4.2 gdb 功能详解及其应用 57
4.2.2 显示数据命令 display 和 print 67
4.2.3 使用断点 73
4.2.4 使用观察窗 77
4.2.5 core dump 分析 81
4.3 其他调试工具 88
4.4 小结与练习 88
4.4.1 小结 88
4.4.2 习题与思考 88
第5章 程序自动维护工具 make 91
5.1 简单使用及属性控制 92
5.1.1 make 的简单使用 94
5.1.2 make 属性的控制 105
5.2.1 宏的使用 112
5.2 高级使用 112
5.2.2 内部规则 118
5.2.3 make 递归 121
5.2.4 依赖性的计算 122
5.3 库的使用 125
5.3.1 创建库和维护库 126
5.3.2 库的链接 127
5.4 小结与练习 128
5.4.1 小结 128
5.4.2 习题与思考 129
第6章 文件操作 131
6.1 文件系统简介 132
6.1.1 文件 132
6.1.2 文件的相关信息 134
6.1.3 文件系统 135
6.2 基于文件描述符的 I/O 操作 136
6.2.1 文件的创建、打开与关闭 136
6.2.2 文件的读写操作 139
6.2.3 文件的定位 144
6.3 文件的其他操作 146
6.3.1 文件属性的修改 146
6.3.2 文件的其他操作 150
6.4 特殊文件的操作 152
6.4.1 目录文件的操作 153
6.4.2 链接文件的操作 154
6.4.3 管道文件的操作 157
6.4.4 设备文件 158
6.5 小结与练习 158
6.5.1 小结 158
6.5.2 习题与思考 159
第7章 输入输出——基于流的操作 161
7.1 流简介 162
7.2 基于流的 I/O 操作 164
7.2.1 流的打开和关闭 164
7.2.2 缓冲区的操作 166
7.2.3 直接输入输出 167
7.2.4 格式化输入输出 170
7.2.5 基于字符和行的输入输出 173
7.3 临时文件 178
7.4 小结与练习 182
7.4.1 小结 182
7.4.2 习题与思考 182
第8章 内存管理 183
8.1.1 静态内存 184
8.1 静态内存与动态内存 184
8.1.2 动态内存 186
8.2 安全性问题 187
8.3 内存管理操作 188
8.3.1 动态内存的分配 188
8.3.2 动态内存的释放 189
8.3.3 调整动态内存的大小 190
8.3.4 分配堆栈 192
8.3.5 内存锁定 193
8.4 使用链表 193
8.5 内存映像 I/O 197
8.5.1 创建内存映像文件 198
8.5.2 撤销内存映像文件 199
8.5.3 将内存映像写入外存 199
8.6.1 小结 202
8.5.4 改变内存映像文件的属性 202
8.6 小结与练习 202
8.6.2 习题与思考 203
第9章 进程控制 205
9.1 进程的基本概念 206
9.1.1 进程基本介绍 206
9.1.2 进程的属性 207
9.2 进程控制的相关函数 208
9.2.1 进程的创建 208
9.2.2 进程等待 213
9.2.3 进程的终止 218
9.2.4 进程 ID 和进程组 ID 222
9.2.5 system 函数 227
9.3.2 时间片的分配 229
9.3.1 进程组 229
9.3 多个进程间的关系 229
9.3.3 进程的同步 231
9.4 线程 232
9.4.1 线程的创建 232
9.4.2 线程属性的设置 232
9.4.3 结束线程 234
9.4.4 线程的挂起 234
9.4.5 取消线程 235
9.4.6 互斥 236
9.5 小结与练习 236
9.5.1 小结 236
9.5.2 习题与思考 237
第2篇 提高篇 241
第10章 信号及信号处理 241
10.1.1 信号简介 242
10.1 信号及其使用简介 242
10.1.2 信号的使用 244
10.2 信号操作的相关系统调用 245
10.2.1 信号处理 245
10.2.2 信号的阻塞 255
10.2.3 发送信号 262
10.3 信号处理的潜在危险 272
10.4 小结与练习 272
10.4.1 小结 272
10.4.2 习题与思考 273
第11章 进程间通信 275
11.1 简介 276
11.2 共享内存和信号量 276
11.2.1 SYSV 子系统的基本概念 277
11.2.2 共享内存 278
11.2.3 信号量 286
11.3 管道 299
11.3.1 管道的创建和关闭 299
11.3.2 管道的读写操作 301
11.4 命名管道 303
11.4.1 命名管道的创建 303
11.4.2 命名管道的使用 304
11.5 消息队列 309
11.5.1 消息队列的创建与打开 310
11.5.2 向消息队列中发送消息 310
11.5.3 从消息队列中接收消息 311
11.5.4 消息队列的控制 312
11.6.2 习题与思考 314
11.6.1 小结 314
11.6 小结与练习 314
第12章 网络编程 315
12.1 基本原理 316
12.1.1 计算机网络体系结构模式 316
12.1.2 TCP/IP 协议 318
12.1.3 客户/服务器模式 319
12.1.4 套接口编程基础 323
12.1.5 IP 地址转换 336
12.2 TCP 套接口编程 341
12.2.1 基于 TCP 的客户——服务器模式 341
12.2.2 信号处理 349
12.2.3 高级技术 350
12.3 UDP 套接口编程 360
12.3.2 主要系统调用函数 361
12.3.1 基于 UDP 的客户——服务器模式 361
12.3.3 基于 UDP 套接口编程实例 362
12.3.4 可靠性问题 365
12.3.5 UDP 套接口的连接 367
12.4 原始套接口编程 368
12.4.1 基本形式和操作 369
12.4.2 原始套接口编程实例 370
12.5 小结与练习 376
12.5.1 小结 376
12.5.2 习题与思考 376
第13章 底层终端编程 377
13.1 底层终端编程 378
13.1.1 属性控制 378
13.1.2 使用 terminfo 381
13.2 伪终端 384
13.3 小结与练习 385
13.3.1 小结 385
13.3.2 习题与思考 385
第3篇 实战篇 389
第14章 实例一 389
14.1 实例 390
14.2 小结与练习 394
14.2.1 小结 394
14.2.2 习题与思考 394
第15章 实例二 395
15.1 实例 396
15.2 小结与练习 406
15.2.1 小结 406
15.2.2 习题与思考 406
附录 部分习题参考答案 407