第1篇 Linux基础知识
第1章 Linux系统概述 2
1.1 引言 2
1.1.1 GNU项目简介 2
1.1.2 Linux起源 2
1.1.3 Linux发展现状 3
1.1.4 免费软件与开源软件 3
1.2 Linux内核与版本 4
1.2.1 Linux内核简介 4
1.2.2 Linux支持的硬件平台 5
1.2.3 常用的Linux版本 5
1.3 系统安装 6
1.3.1 安装前的准备 6
1.3.2 系统需求 7
1.3.3 硬盘分区 7
1.3.4 准备安装媒介 8
1.3.5 以图形方式安装Linux 8
1.3.6 升级为最新的内核版本 10
1.3.7 安装中文支持 10
1.4 小结 11
1.5 习题 11
第2章 Linux基本操作 12
2.1 登录 12
2.1.1 Shell程序 12
2.1.2 控制台 12
2.1.3 终端 13
2.2 文件和目录 14
2.2.1 文件系统 14
2.2.2 文件名 15
2.2.3 路径名 16
2.2.4 工作目录 16
2.2.5 起始目录 16
2.3 输入和输出 17
2.3.1 文件描述符 17
2.3.2 标准输入、标准输出和标准错误 17
2.3.3 标准输入和输出函数 17
2.4 小结 17
2.5 习题 18
第3章 Linux C的编译器与调试器 19
3.1 GCC和G++编译器 19
3.1.1 GCC和G++编译器的安装 19
3.1.2 GCC和G++编译命令 19
3.1.3 GCC和G++编译选项 20
3.1.4 GCC和G++编译器的执行过程 20
3.2 程序和进程 21
3.2.1 程序 21
3.2.2 进程和PID 21
3.3 ANSI C标准 22
3.3.1 函数原型 22
3.3.2 类属指针 22
3.3.3 原始系统数据类型 22
3.4 编译hello world 23
3.4.1 使用Vi编写源代码 23
3.4.2 程序的编译与连接 24
3.4.3 使用终端运行程序 24
3.5 GDB调试器 24
3.5.1 GDB调试器简介 24
3.5.2 GDB调试器的安装 25
3.5.3 GDB常用的调试命令 25
3.5.4 在GDB中运行程序 26
3.5.5 检查数据 26
3.6 小结 26
3.7 习题 27
第4章 Linux开发环境 28
4.1 文本编辑工具 28
4.1.1 Vim的使用方法 28
4.1.2 Emacs的使用方法 29
4.2 集成开发环境 30
4.2.1 Eclipse简介 30
4.2.2 Kdevelop简介 30
4.3 使用Eclipse开发C和C++程序 31
4.3.1 安装与配置Eclipse 31
4.3.2 Eclipse界面 31
4.3.3 编译与运行源代码 32
4.3.4 调试源代码 33
4.4 小结 33
4.5 习题 34
第2篇 C/C++语言基础知识
第5章 C语言编程基础 36
5.1 程序设计语言的发展 36
5.1.1 机器语言 36
5.1.2 汇编语言 36
5.1.3 高级语言 36
5.2 C语言的特点 37
5.2.1 C语言是中级语言 37
5.2.2 C语言是结构化语言 38
5.2.3 C语言是程序员的语言 38
5.3 C语言的程序结构 38
5.3.1 基本程序结构 39
5.3.2 函数库和链接 40
5.3.3 开发一个C语言程序 41
5.3.4 C语言的关键字 42
5.4 算法 42
5.4.1 流程图与算法的结构化描述 42
5.4.2 用N-S图描述算法 44
5.4.3 用PAD图描述算法 44
5.5 软件工程概述 45
5.5.1 认识软件工程 45
5.5.2 瀑布模型及其改进 46
5.5.3 迭代发布模型 47
5.5.4 朴素软件工程思想 47
5.6 小结 49
5.7 习题 49
第6章 数据类型、运算符和表达式 51
6.1 C语言的数据类型 51
6.1.1 基本类型的字长与范围 51
6.1.2 聚合类型与修饰符 52
6.2 常量与变量 53
6.2.1 标识符命名 53
6.2.2 常量 53
6.2.3 变量 54
6.3 整型数据 55
6.3.1 整型常量 55
6.3.2 整型变量 55
6.4 浮点型数据 56
6.4.1 浮点型常量 56
6.4.2 浮点型变量 56
6.5 字符型数据 57
6.5.1 字符常量 57
6.5.2 字符串常量 57
6.5.3 转义字符 57
6.5.4 符号常量 58
6.5.5 字符变量 58
6.6 运算符 59
6.6.1 算术运算符 59
6.6.2 自增和自减 59
6.6.3 关系和逻辑运算符 60
6.6.4 位操作符 61
6.6.5 问号操作符 61
6.6.6 逗号操作符 62
6.6.7 优先级 62
6.7 表达式 63
6.7.1 表达式中的类型转换 63
6.7.2 构成符 63
6.7.3 空格与括号 64
6.7.4 C语言中的简写形式 64
6.8 C语言的预处理命令 64
6.8.1 宏替换命令 64
6.8.2 终止编译命令 65
6.8.3 文件包含命令 65
6.8.4 条件编译命令 66
6.8.5 修改行号命令 67
6.8.6 编译指示命令 68
6.8.7 预定义的宏名 68
6.8.8 注释 69
6.9 小结 69
6.10 习题 69
第7章 程序控制结构 71
7.1 程序的3种基本结构 71
7.2 数据的输入与输出 71
7.2.1 scanf()函数 71
7.2.2 printf()函数 73
7.2.3 getchar()函数与putchar()函数 74
7.3 条件控制语句 75
7.3.1 if语句 75
7.3.2 switch语句 76
7.4 循环控制语句 77
7.4.1 while语句 78
7.4.2 do-while语句 78
7.4.3 for语句 79
7.4.4 break语句与continue语句 80
7.5 媒体播放器——建立程序结构 81
7.5.1 编写伪代码 81
7.5.2 建立媒体播放器的程序结构 82
7.6 小结 84
7.7 习题 84
第8章 数组与指针 86
8.1 一维数组 86
8.1.1 一维数组的一般形式 86
8.1.2 字符串使用的一维数组 88
8.2 二维数组 89
8.2.1 二维数组的一般形式 89
8.2.2 二维字符串数组 89
8.3 多维数组 90
8.4 指针与指针变量 90
8.5 指针变量的定义与引用 92
8.5.1 指针变量的定义 92
8.5.2 指针变量的引用 93
8.6 指针与数组 93
8.6.1 指针与一维数组 94
8.6.2 指针与二维数组 94
8.6.3 指针与字符串数组 95
8.7 指针的地址分配 96
8.8 指针数组 97
8.9 指向指针的指针 97
8.10 媒体播放器——建立播放列表 98
8.10.1 建立一个播放列表 98
8.10.2 对播放列表排序 102
8.11 小结 104
8.12 习题 104
第9章 函数 106
9.1 函数说明与返回值 106
9.1.1 函数的类型说明 106
9.1.2 返回语句 107
9.2 函数的作用域规则 108
9.2.1 局部变量 108
9.2.2 全局变量 109
9.2.3 动态存储变量 110
9.2.4 静态存储变量 110
9.3 函数的调用与参数 111
9.3.1 形式参数与实际参数 111
9.3.2 赋值调用与引用调用 111
9.4 递归 112
9.5 实现问题 113
9.5.1 参数和通用函数 113
9.5.2 效率 114
9.6 函数库和文件 114
9.6.1 程序文件的大小 114
9.6.2 分类组织文件 115
9.6.3 函数库 116
9.7 main()函数的参数 117
9.8 媒体播放器——建立核心控制模块 117
9.8.1 通过函数传递参数 118
9.8.2 建立媒体播放器的核心控制模块 121
9.9 小结 125
9.10 习题 125
第10章 字符与字符串处理 127
10.1 字符编码 127
10.1.1 ASCII编码 127
10.1.2 Unicode编码 127
10.2 字符处理库 128
10.3 字符串转换函数 129
10.4 字符串处理函数 131
10.5 字符串比较函数 132
10.6 字符串查找函数 133
10.7 字符串内存函数 134
10.8 字符串的其他函数 136
10.9 媒体播放器——实现播放列表的检索功能 136
10.9.1 对播放列表中的整个字符串进行排序 136
10.9.2 在播放列表中查找字符串 137
10.10 小结 142
10.11 习题 142
第11章 结构体与共用体 144
11.1 结构体类型变量的定义和引用 144
11.1.1 结构体类型变量的定义 144
11.1.2 结构体类型变量的引用 145
11.1.3 结构体类型变量的初始化 146
11.2 结构体数组的定义和引用 146
11.3 结构体指针的定义和引用 147
11.3.1 使用指向结构体类型变量的指针 147
11.3.2 使用指向结构体类型数组的指针 148
11.4 共用体 148
11.4.1 共用体的定义 148
11.4.2 共用体变量的引用 149
11.5 媒体播放器——建立媒体库 150
11.5.1 设计媒体库的数据结构 150
11.5.2 媒体库的基本操作 153
11.5.3 在媒体库中添加文件 155
11.5.4 在媒体库中查找文件 158
11.5.5 从媒体库中删除选定的文件 159
11.5.6 删除媒体库中的所有文件 160
11.6 小结 160
11.7 习题 161
第12章 C++语言编程基础 162
12.1 类和数据抽象 162
12.1.1 用类实现数据抽象 162
12.1.2 类的作用域和访问类成员 164
12.1.3 从实现中分离接口 164
12.1.4 控制访问成员 165
12.1.5 构造函数和析构函数 165
12.1.6 const对象和const成员函数 166
12.1.7 friend对象和friend类 167
12.1.8 this指针 168
12.1.9 动态内存分配 168
12.1.10 static类成员 169
12.2 C++的特性 169
12.2.1 运算符重载 170
12.2.2 继承 171
12.2.3 虚拟函数和多态性 171
12.2.4 流输入与输出 172
12.2.5 模板 172
12.2.6 异常处理 173
12.3 小结 174
12.4 习题 174
第3篇 Linux系统编程
第13章 文件操作 176
13.1 文件的属性与权限 176
13.1.1 文件的属性 176
13.1.2 文件的权限 177
13.1.3 修改文件的权限 177
13.2 文件管理 178
13.2.1 系统调用的原理 178
13.2.2 打开文件、新建文件和关闭文件操作 178
13.2.3 文件状态和属性操作 181
13.2.4 目录操作 183
13.2.5 删除目录或文件操作 185
13.2.6 错误处理 186
13.3 媒体播放器——增强媒体库的功能 186
13.3.1 在媒体库中添加目录 186
13.3.2 搜索本地硬盘中的所有媒体文件 188
13.4 小结 188
13.5 习题 188
第14章 文件I/O操作 190
14.1 非缓冲文件操作 190
14.1.1 使用read()函数读取文件 190
14.1.2 使用write()函数写入文件 191
14.1.3 随机读写文件 192
14.2 缓冲文件操作 193
14.2.1 打开与关闭文件流 193
14.2.2 读取与写入文件流 194
14.2.3 文件流的格式化输入与输出 196
14.2.4 文件流的定位操作 197
14.2.5 文件流操作的其他函数 198
14.2.6 文件流操作的错误处理 198
14.3 媒体播放器——完善播放列表 199
14.3.1 读取播放列表文件 199
14.3.2 将播放列表保存为文件 201
14.4 小结 202
14.5 习题 202
第15章 进程控制 204
15.1 进程简述 204
15.1.1 进程的状态和状态转换 204
15.1.2 进程控制 207
15.1.3 进程调度 208
15.2 进程的基本操作 208
15.2.1 fork系统调用 208
15.2.2 exec系统调用 210
15.2.3 exit系统调用 211
15.2.4 wait系统调用 212
15.2.5 sleep系统调用 213
15.3 进程的特殊操作 213
15.3.1 获得进程ID 213
15.3.2 设置进程的UID和GID 214
15.3.3 设置进程的PGID 214
15.3.4 设置进程的当前工作目录 215
15.3.5 设置根目录 215
15.3.6 设置进程的优先级 215
15.4 小结 215
15.5 习题 216
第16章 进程间的通信 217
16.1 进程之间的管道通信 217
16.1.1 pipe系统调用 218
16.1.2 dup系统调用 219
16.2 进程之间的D-Bus通信 220
16.2.1 D-Bus的基本概念 220
16.2.2 D-Bus用例 221
16.3 媒体播放器——完善退出和音量控制功能 224
16.3.1 媒体播放器在桌面环境退出时响应 224
16.3.2 调整系统音量 225
16.4 小结 227
16.5 习题 227
第17章 线程控制 228
17.1 线程的基本概念 228
17.2 线程的实现 228
17.2.1 用户态线程 229
17.2.2 内核态线程 229
17.3 POSIX线程库 229
17.3.1 创建线程 229
17.3.2 结束线程 230
17.4 同步 231
17.4.1 信号量同步 232
17.4.2 互斥量同步 233
17.5 取消线程 235
17.6 多线程的实现 237
17.7 小结 238
17.8 习题 239
第4篇 Linux网络编程与数据库开发
第18章 网络编程基础 242
18.1 计算机网络的组成 242
18.1.1 网络结构 242
18.1.2 OSI参考模型 244
18.1.3 TCP/IP参考模型 245
18.2 TCP/IP概述 246
18.2.1 IP与Internet 246
18.2.2 IP地址 247
18.2.3 TCP简介 248
18.2.4 UDP简介 249
18.3 Socket套接字 250
18.3.1 Socket套接字简介 250
18.3.2 创建套接字 251
18.3.3 套接字地址 252
18.3.4 套接字的名字 252
18.3.5 创建套接字队列 253
18.3.6 接受连接 253
18.3.7 请求连接 254
18.3.8 关闭连接 255
18.3.9 套接字通信 255
18.4 网络通信 256
18.4.1 查询主机名称 257
18.4.2 Internet守护进程 259
18.5 小结 260
18.6 习题 260
第19章 网络编程函数库 261
19.1 HTTP与FTP函数库 261
19.1.1 libcurl函数库简介 261
19.1.2 libcurl函数库中的主要函数 262
19.1.3 使用libcurl函数库实现简单的HTTP访问 264
19.2 SMTP、POP与IMAP函数库 265
19.2.1 使用libESMTP函数库实现电子邮件的发送 265
19.2.2 使用libspopc函数库实现POP访问 267
19.2.3 使用mailutils函数库实现IMAP访问 269
19.3 即时通信函数库 269
19.3.1 libpurple函数库简介 269
19.3.2 即时通信软件的工作机制 270
19.3.3 使用libpurple函数库接入服务器 271
19.4 小结 278
19.5 习题 278
第20章 数据库开发 279
20.1 数据的存储与访问 279
20.1.1 使用数据文件 279
20.1.2 使用数据库 283
20.2 Berkeley DB数据包 284
20.2.1 Berkeley DB数据包简介 285
20.2.2 Berkeley DB数据包的连接和使用 286
20.2.3 Berkeley DB数据包的访问 292
20.2.4 Berkeley DB数据包中的游标 293
20.3 PostgreSQL数据库服务器 295
20.3.1 PostgreSQL的基本简介 295
20.3.2 数据库连接函数 296
20.3.3 命令执行函数 299
20.3.4 查询结果检索函数 302
20.4 小结 305
20.5 习题 306
第21章 Linux系统常用数据库与接口 307
21.1 SQLite数据库 307
21.1.1 SQLite简介 307
21.1.2 连接SQLite数据库 308
21.1.3 SQLite命令执行函数 311
21.1.4 SQLite检索查询结果函数 312
21.2 MySQL数据库 315
21.2.1 MySQL简介 315
21.2.2 连接MySQL数据库 316
21.2.3 查询MySQL数据库 318
21.2.4 处理MySQL查询结果 319
21.3 大型数据库与通用数据库接口 321
21.3.1 连接Oracle数据库 321
21.3.2 通用数据库接口 323
21.4 媒体播放器——媒体库的数据库实现 329
21.4.1 建立和连接数据库 329
21.4.2 建立媒体库数据表 330
21.4.3 管理媒体库数据表 331
21.5 小结 335
21.6 习题 335
第5篇 Linux界面开发
第22章 界面开发基础知识 338
22.1 Linux常用的桌面环境 338
22.1.1 GNOME桌面环境 338
22.1.2 KDE桌面环境 339
22.2 GTK+图形环境简介 340
22.3 GLib函数库简介 341
22.3.1 基础类型 341
22.3.2 对核心应用的支持 341
22.3.3 实用功能 343
22.3.4 数据类型 344
22.4 GObject对象简介 345
22.4.1 对象系统 345
22.4.2 GObject系统中的宏定义 346
22.4.3 GTypeInfo结构 348
22.4.4 信号机制 349
22.5 2D图形引擎Cairo简介 349
22.6 多媒体函数库GStreamer简介 351
22.6.1 过滤器 351
22.6.2 衬垫 352
22.6.3 箱柜 352
22.6.4 精灵衬垫 353
22.7 搭建GTK+开发环境 355
22.8 小结 356
22.9 习题 357
第23章 界面构件开发 358
23.1 常用的界面构件 358
23.1.1 按钮构件 358
23.1.2 调整对象 361
23.1.3 范围构件 361
23.1.4 标签构件 362
23.1.5 工具提示对象 363
23.1.6 进度条 363
23.1.7 对话框 363
23.1.8 状态栏 364
23.1.9 文本输入构件 365
23.1.10 微调按钮 367
23.1.11 组合输入框 369
23.1.12 日历构件 369
23.1.13 颜色选择对话框 370
23.1.14 文件选择构件 371
23.2 复合构件 372
23.2.1 快捷标签 373
23.2.2 字体选择对话框 374
23.2.3 消息对话框 377
23.2.4 图像构件 379
23.2.5 文本视区构件 381
23.3 菜单相关构件 381
23.3.1 菜单栏 382
23.3.2 菜单构件 382
23.3.3 菜单项 384
23.3.4 复选菜单项 387
23.3.5 单选菜单项 389
23.3.6 分隔菜单项 390
23.4 小结 390
23.5 习题 390
第24章 界面布局 392
24.1 界面布局简介 392
24.1.1 界面的宽度与高度 392
24.1.2 窗体的基本构件 393
24.1.3 布局约定 395
24.2 组装盒构件 396
24.2.1 组装盒的原理 397
24.2.2 组装盒示例 398
24.2.3 网格组装的原理 399
24.2.4 网格组装示例 400
24.3 容器 401
24.3.1 事件盒 401
24.3.2 固定容器 403
24.3.3 布局容器 404
24.3.4 框架构件 405
24.3.5 比例框架 408
24.3.6 分栏窗体构件 409
24.3.7 视角构件 410
24.3.8 滚动条窗体 410
24.3.9 按钮盒 412
24.3.10 工具栏 415
24.3.11 笔记本 417
24.4 媒体播放器——界面实现 421
24.4.1 使用原型法设计媒体播放器界面 421
24.4.2 编写媒体播放器界面代码 425
24.5 小结 433
24.6 习题 433
第25章 信号与事件处理 435
25.1 信号函数与回调函数 435
25.1.1 信号函数 435
25.1.2 回调函数 439
25.2 常用的GTK+信号与事件 440
25.2.1 GtkObject类信号 441
25.2.2 GtkWidget界面构件信号 442
25.2.3 GtkWindow窗体构件信号 450
25.2.4 GtkContainer容器构件信号 451
25.2.5 GtkCalendar日历构件信号 451
25.2.6 GtkTextView文本视区构件信号 452
25.3 小结 453
25.4 习题 453
第26章 Glade程序界面设计 455
26.1 Glade简介 455
26.2 构造图形界面 456
26.2.1 添加窗体 456
26.2.2 添加容器 460
26.2.3 添加构件 465
26.2.4 设置构件属性 468
26.2.5 添加事件和回调函数 469
26.3 C语言代码联编 471
26.3.1 使用GTK+函数库连接Glade项目文件 471
26.3.2 使用GTK+的多语言支持功能 473
26.4 小结 476
26.5 习题 476
第6篇 Linux 环境C编程项目实战
第27章 编程项目实战——媒体播放器的实现 480
27.1 软件工程实战 480
27.1.1 项目需求分析 480
27.1.2 软件需求说明 481
27.1.3 项目视图的解决方案 481
27.2 软件设计 482
27.2.1 需求分析 482
27.2.2 制订开发计划 482
27.2.3 分工协作 483
27.3 版本控制 483
27.3.1 Git服务器搭建 483
27.3.2 Git的上传和备份 485
27.4 在Eclipse中使用Git 486
27.4.1 将代码上传到服务器上 486
27.4.2 将代码导入Eclipse 488
27.5 音量控制对话框 490
27.5.1 创建对话框 490
27.5.2 添加垂直比例尺 491
27.5.3 测试 491
27.6 播放列表对话框 492
27.6.1 创建对话框 492
27.6.2 创建工具条和工具条按钮 493
27.6.3 创建树视图 495
27.6.4 创建对话框按钮 495
27.6.5 测试 496
27.7 媒体库对话框 497
27.7.1 创建对话框 497
27.7.2 创建工具条和工具条按钮 497
27.7.3 创建分类部件和媒体信息显示部件 499
27.7.4 创建搜索部件 500
27.7.5 创建对话框按钮 501
27.7.6 测试 501
27.8 播放控制模块的实现 504
27.8.1 播放控制模块程序结构 504
27.8.2 MP3播放功能的实现 505
27.8.3 播放中的回调处理 508
27.9 系统集成 510
27.10 主程序文件的实现 510
27.10.1 头文件和主函数入口 510
27.10.2 媒体库模块初始化 511
27.10.3 图形界面初始化 512
27.10.4 退出前的清理 512
27.10.5 编译和运行 513
27.11 媒体库功能集成 513
27.11.1 初始化 513
27.11.2 显示媒体库对话框 513
27.11.3 添加文件 520
27.11.4 添加目录 522
27.11.5 删除文件信息 523
27.11.6 删除所有的文件信息 525
27.11.7 搜索本地文件 526
27.11.8 向播放列表传递文件 527
27.11.9 查找 528
27.12 播放列表功能集成 529
27.12.1 初始化 530
27.12.2 显示播放列表对话框 530
27.12.3 添加文件 532
27.12.4 添加目录 534
27.12.5 打开文件 535
27.12.6 保存文件 536
27.12.7 删除文件 537
27.12.8 删除全部 538
27.12.9 排序 539
27.13 播放控制模块集成 540
27.13.1 播放模式设置 540
27.13.2 开始播放 540
27.13.3 暂停播放 541
27.13.4 停止播放 542
27.13.5 播放上一首 542
27.13.6 播放下一首 542
27.14 小结 543