第一篇 Linux和C编程基础 2
第1章 Linux系统概述 2
1.1 Linux操作系统介绍 2
1.1.1 Linux的发展历程 2
1.1.2 Linux的特性 2
1.1.3 Linux的内核版本和发行版本 3
1.2 C语言简介 4
1.2.1 C语言的发展历史 4
1.2.2 C语言的特点 5
1.3 Linux的安装、启动与关闭 5
1.4 Linux的基本使用 5
1.4.1 Linux终端 5
1.4.2 Linux Shell 5
1.4.3 Linux的常用命令 6
1.5 Linux下程序的开发环境和开发过程 9
1.6 习题 12
第2章 C编程基础、Vi和Emacs编辑器 13
2.1 C程序的结构 13
2.2 C语言的基本数据类型 14
2.2.1 整型 14
2.2.2 浮点型 16
2.2.3 字符型 17
2.3 运算符和表达式 19
2.3.1 算术运算符与算术表达式 20
2.3.2 赋值运算符与赋值表达式 22
2.3.3 逗号运算符与逗号表达式 22
2.4 标准输入输出函数 23
2.4.1 字符输出函数putchar 23
2.4.2 字符输入函数getchar 24
2.4.3 格式化输出函数printf 24
2.4.4 格式化输入函数scanf 26
2.5 Vi编辑器的使用 27
2.5.1 Vi的工作模式 27
2.5.2 启动Vi 28
2.5.3 保存文件和退出Vi 29
2.5.4 光标的移动 29
2.5.5 文本的删除 30
2.5.6 文本查找和替换 30
2.5.7 文本的复制与粘贴 30
2.6 Emacs编辑器的使用 31
2.7 命名规范 33
2.7.1 标识符 33
2.7.2 关键字 33
2.7.3 命名规范 33
2.8 面试题选与实例精讲 34
2.8.1 面试题选 34
2.8.2 实例精讲 35
2.9 习题 37
第3章 C程序控制结构和gcc编译器 38
3.1 C程序的控制结构 38
3.1.1 C程序语句概述 38
3.1.2 C程序的3种基本控制结构 39
3.2 分支控制结构 40
3.2.1 关系运算符与关系表达式 40
3.2.2 逻辑运算符与逻辑表达式 41
3.2.3 if语句 42
3.2.4 switch语句 44
3.3 循环控制结构 46
3.3.1 while语句 46
3.3.2 do...while语句 47
3.3.3 for语句 48
3.3.4 break语句和continue语句 50
3.4 gcc编译器 51
3.4.1 程序的编译过程 51
3.4.3 gcc的常用选项 52
3.4.3 gcc的报错类型及对策 54
3.5 面试题选与实例精讲 55
3.5.1 面试题选 55
3.5.2 实例精讲 56
3.6 习题 58
第4章 C函数、数组、指针和调试器gdb 59
4.1 函数 59
4.1.1 函数的定义 59
4.1.2 函数的调用 61
4.1.3 变量的访问控制和存储类别 64
4.2 数组 67
4.2.1 一维数组的定义和使用 67
4.2.2 二维数组的定义和使用 67
4.2.3 字符数组和字符串 69
4.3 指针 70
4.3.1 地址和指针 70
4.3.2 指针的定义和使用 71
4.3.3 指针和数组 72
4.3.4 指针和函数 75
4.3.5 指向字符串的指针 79
4.4 字符串函数 82
4.4.1 puts和gets 82
4.4.2 strcpy和strncpy 82
4.4.3 strcat和strncat 83
4.4.4 strcmp和strncmp 83
4.4.5 strlen 84
4.4.6 strlwr和strupr 84
4.4.7 strstr和strchr 84
4.5 调试器gdb 85
4.5.1 启动和退出gdb 85
4.5.2 显示和查找程序源代码 86
4.5.3 执行程序和获得帮助 87
4.5.4 设置和管理断点 87
4.5.5 查看和设置变量的值 91
4.5.6 控制程序的执行 93
4.6 面试题选 95
4.7 习题 106
第5章 C语言预处理、结构体和make的使用 107
5.1 C语言预处理命令 107
5.1.1 宏定义 107
5.1.2 文件包含 109
5.1.3 条件编译 110
5.2 结构体和共用体 111
5.2.1 声明和引用结构体 111
5.2.2 结构体和数组 113
5.2.3 结构体和指针 114
5.2.4 共用体 116
5.2.5 使用typedef 117
5.3 位运算 117
5.3.1 位运算符和位运算 117
5.3.2 位域 119
5.4 make的使用和Makefile的编写 120
5.4.1 make的一般使用 121
5.4.2 Makefile文件的构成 123
5.4.3 使用变量 127
5.4.4 隐含规则 131
5.4.5 使用条件语句 132
5.4.6 使用库 133
5.4.7 make命令参数详解 134
5.5 面试题选 135
5.6 进一步学习建议 140
5.7 习题 140
第二篇 Linux系统编程 142
第6章 文件操作 142
6.1 系统编程概述 142
6.2 Linux的文件结构 142
6.2.1 Linux的文件系统模型 143
6.2.2 文件的分类 144
6.2.3 文件的访问权限控制 145
6.3 文件的输入输出 147
6.3.1 文件的创建、打开与关闭 147
6.3.2 文件的读写 149
6.3.3 文件读写指针的移动 150
6.3.4 dup、dup2、fcntl、ioctl系统调用 152
6.4 文件属性操作 160
6.4.1 获取文件属性 160
6.4.2 设置文件属性 162
6.5 文件的移动和删除 164
6.5.1 文件的移动 164
6.5.2 文件的删除 165
6.6 目录操作 166
6.6.1 目录的创建和删除 166
6.6.2 获取当前目录 167
6.6.3 设置工作目录 167
6.6.4 获取目录信息 168
6.7 编程实践:实现自己的ls命令 170
6.8 习题 176
第7章 进程控制 177
7.1 进程概述 177
7.1.1 Linux进程 177
7.1.2 进程控制 179
7.1.3 进程的内存映像 179
7.2 进程操作 180
7.2.1 创建进程 180
7.2.2 创建守护进程 185
7.2.3 进程退出 187
7.2.4 执行新程序 188
7.2.5 等待进程结束 191
7.3 进程的其他操作 194
7.3.1 获得进程ID 194
7.3.2 setuid和setgid 194
7.3.3 改变进程的优先级 196
7.4 编程实践:实现自己的myshell 197
7.5 习题 203
第8章 线程控制 204
8.1 线程和进程关系 204
8.2 创建线程 205
8.2.1 线程创建函数pthread_create 205
8.2.2 线程属性 207
8.3 线程终止 208
8.4 私有数据 210
8.5 线程同步 212
8.5.1 互斥锁 212
8.5.2 条件变量 213
8.5.3 异步信号 216
8.6 出错处理 216
8.6.1 错误检查 216
8.6.2 错误码 217
8.6.3 错误的提示信息 218
8.7 习题 219
第9章 信号及信号处理 220
9.1 Linux信号介绍 220
9.1.1 信号的来源 220
9.1.2 信号的种类 220
9.1.3 进程对信号的响应 223
9.2 信号处理 223
9.2.1 信号的捕捉和处理 223
9.2.2 信号处理函数的返回 227
9.2.3 信号的发送 231
9.2.4 信号的屏蔽 236
9.3 编程中如何获得帮助 240
9.4 编程实践:应用实例 240
9.4.1 实例一:信号的发送与处理 240
9.4.2 实例二:信号应用于事件通知 242
9.5 习题 244
第10章 进程间通信 245
10.1 进程间通信概述 245
10.2 管道 246
10.2.1 管道的概念 246
10.2.2 管道的创建与读写 246
10.2.3 管道的应用实例 250
10.3 有名管道 251
10.3.1 有名管道的概念 251
10.3.2 有名管道的创建与读写 252
10.3.3 有名管道的应用实例 253
10.4 消息对列 256
10.4.1 消息对列的基本概念 256
10.4.2 消息队列的创建与读写 257
10.4.3 获取和设置消息队列的属性 260
10.4.4 消息队列的应用实例 262
10.5 信号量 265
10.5.1 信号量的基本概念 265
10.5.2 信号量的创建与使用 265
10.5.3 信号量的应用实例 268
10.6 共享内存 270
10.6.1 共享内存的数据结构 270
10.6.2 共享内存的创建与操作 270
10.6.3 共享内存的应用实例 271
10.7 库的创建和使用 275
10.7.1 Linux库的概念 275
10.7.2 静态库的创建和使用 276
10.7.3 动态库的创建和使用 277
10.8 进一步学习建议 279
10.9 习题 279
第三篇 Linux网络和图形界面编程第11章 网络编程 282
11.1 网络编程基本原理 282
11.1.1 网络模型与协议 282
11.1.2 地址 284
11.1.3 端口 285
11.1.4 IP协议 285
11.1.5 用户数据报协议UDP 286
11.1.6 传输控制协议TCP 286
11.1.7 客户机/服务器模型 287
11.2 套接字编程 287
11.2.1 套接字地址结构 288
11.2.2 创建套接字 288
11.2.3 建立连接 289
11.2.4 绑定套接字 290
11.2.5 在套接字上监听 290
11.2.6 接受连接 291
11.2.7 TCP套接字的数据传输 291
11.2.8 UDP套接字的数据传输 292
11.2.9 关闭套接字 294
11.2.10 主要系统调用函数 294
11.3 一个面向连接的Client/Server实例 301
11.4 编写安全的代码 308
11.4.1 网络攻击 308
11.4.2 缓冲区溢出 309
11.4.3 输入检查 310
11.5 编程实践:编程实现端口扫描器实例 311
11.6 进一步学习建议 314
11.7 习题 314
第12章 GTK+图形界面编程 315
12.1 Linux下的图形界面编程 315
12.1.1 Qt和GTK+ 315
12.1.2 GTK+简介 315
12.2 一个简单的例子 316
12.3 消息和回调函数 319
12.4 GTK+的面向对象机制 320
12.5 排列控件 323
12.5.1 使用box排列控件 323
12.5.2 使用table排列控件 325
12.6 常用控件 330
12.6.1 进度条、微条按钮、组合框 330
12.6.2 表格控件 332
12.6.3 生成对话框 333
12.6.4 使用菜单 334
12.7 进一步学习建议 336
第四篇 Linux项目实践 338
第13章 项目实践:BT下载软件的开发 338
13.1 BT软件简述 338
13.2 BitTorrent协议 339
13.2.1 概要介绍 339
13.2.2 基于BT协议的文件分发系统的构成 339
13.2.3 B编码 340
13.2.4 种子文件的结构 340
13.2.5 与Tracker交互 342
13.2.6 peer之间的通信协议 343
13.2.7 关键算法和策略 345
13.3 系统结构设计 347
13.4 各个模块的设计和实现 348
13.4.1 种子解析模块的设计和实现 349
13.4.2 位图管理模块的设计和实现 359
13.4.3 出错处理模块的设计和实现 363
13.4.4 运行日志模块的设计和实现 364
13.4.5 信号处理模块的设计和实现 365
13.4.6 Peer管理模块的设计和实现 366
13.4.7 消息处理模块的设计和实现 372
13.4.8 缓冲管理模块的设计和实现 384
13.4.9 策略管理模块的设计和实现 393
13.4.10 连接Tracker模块的设计和实现 397
13.4.11 与peer交换数据模块的设计和实现 403
13.4.12 主函数的设计和实现 411
13.4.13 调试和测试 412