第1章 Linux编程环境 1
1.1 基本工具 1
1.1.1 免费大餐:Ubuntu 1
1.1.2 桌面系统:gnome 6
1.1.3 网络配置:纯手工打造 6
1.1.4 软件集散地:APT 8
1.1.5 无敌板斧:vi 10
1.1.6 开发圣典:man 13
1.1.7 配置共享目录 15
1.2 Shell命令 17
1.2.1 概念扫盲 17
1.2.2 命令详解 19
1.2.3 上古神器 38
1.3 Shell脚本编程 45
1.3.1 开场白 45
1.3.2 脚本格式 45
1.3.3 变量 46
1.3.4 特殊符号们 48
1.3.5 字符串处理 50
1.3.6 测试语句 51
1.3.7 脚本语法单元 52
1.4 编译器:GCC 55
1.4.1 简述 55
1.4.2 编译过程简介 55
1.4.3 实用的编译选项 58
1.5 解剖Makefile 59
1.5.1 工程管理器make 59
1.5.2 概览性示例 60
1.5.3 书写格式 60
1.5.4 变量详解 62
1.5.5 各种规则 71
1.5.6 条件判断 75
1.5.7 函数 77
1.5.8 实用make选项集锦 85
1.6 GNU-autotools 86
1.6.1 autotools简介 86
1.6.2 文件组织 87
1.6.3 configure.ac编写规则 88
第2章 深度Linux-C 92
2.1 基本要素 92
2.1.1 Linux下C代码规范 93
2.1.2 基本数据类型 97
2.1.3 运算符 108
2.1.4 控制流 116
2.2 函数 124
2.2.1 函数初体验 125
2.2.2 函数调用内幕 128
2.2.3 递归思维及其实现 130
2.2.4 变参函数 133
2.2.5 回调函数 137
2.2.6 内联函数 140
2.3 数组与指针 142
2.3.1 数组初阶 142
2.3.2 内存地址 144
2.3.3 指针初阶 145
2.3.4 复杂指针定义 147
2.3.5 指针运算 151
2.3.6 数组与指针 152
2.3.7 复杂数组剖析 155
2.3.8 const指针 158
2.3.9 char指针和char数组 160
2.4 内存管理 162
2.4.1 进程内存布局 162
2.4.2 堆(Heap) 164
2.5 组合数据类型 167
2.5.1 结构体 167
2.5.2 共用体 171
2.5.3 枚举 172
2.6 高级议题 173
2.6.1 工程代码组织 173
2.6.2 头文件 175
2.6.3 宏(macro) 176
2.6.4 条件编译 182
2.6.5 复杂声明 184
2.6.6 attribute机制 185
第3章 Linux的数据组织 188
3.1 无所不在的链表 188
3.1.1 开场白 188
3.1.2 单向链表 190
3.1.3 单向循环链表 198
3.1.4 双向循环链表 200
3.1.5 Linux内核链表 210
3.2 线性表变异体 227
3.2.1 堆叠的盘子:栈 227
3.2.2 文明的社会:队列 236
3.3 小白慎入:非线性结构 243
3.3.1 基本概念 243
3.3.2 玩转BST 247
3.3.3 各种的遍历算法 260
3.3.4 自平衡AVL树 263
3.3.5 自平衡Linux红黑树 273
第4章 I/O编程技术 289
4.1 一切皆文件 289
4.1.1 文件的概念 289
4.1.2 各类文件 290
4.2 文件操作 290
4.2.1 系统I/O 291
4.2.2 标准I/O 306
4.2.3 文件属性 320
4.3 目录检索 327
4.3.1 基本概念 327
4.3.2 相关API 328
4.4 触控屏应用接口 330
4.4.1 输入子系统简介 330
4.4.2 TSLIB库详解 333
4.4.3 划屏算法 338
第5章 Linux进程线程 345
5.1 Linux进程入门 345
5.1.1 进程概念 345
5.1.2 进程组织方式 346
5.2 进程的“生老病死” 348
5.2.1 进程状态 348
5.2.2 相关重要API 350
5.3 进程的语言 358
5.3.1 管道 358
5.3.2 信号 363
5.3.3 system-V IPC简介 380
5.3.4 消息队列(MSG) 381
5.3.5 共享内存(SHM) 387
5.3.6 信号量(SEM) 392
5.4 Linux线程入门 400
5.4.1 线程基本概念 400
5.4.2 线程API及特点 401
5.5 线程安全 410
5.5.1 POSIX信号量 410
5.5.2 互斥锁与读写锁 415
5.5.3 条件变量 418
5.5.4 可重入函数 421
5.6 线程池 422
5.6.1 实现原理 422
5.6.2 接口设计 423
5.6.3 实现源码 425
第6章 Linux音频、视频编程 433
6.1 基本背景 433
6.2 Linux音频 433
6.2.1 音频概念 433
6.2.2 标准音频接口ALSA 436
6.3 Linux视频输出 450
6.3.1 基本概念 450
6.3.2 framebuffer 452
6.3.3 在LCD上画图 462
6.3.4 效果算法 469
6.4 Linux视频输入 478
6.4.1 V4L2简介 478
6.4.2 V4L2视频采集流程 478
6.4.3 V4L2核心命令字和结构体 481
6.4.4 编码格式和媒体流 484
6.5 多媒体开发库SDL 489
6.5.1 SDL简介 489
6.5.2 编译和移植 489
6.5.3 视频子系统 490
6.5.4 音频子系统 494
6.5.5 事件子系统 498
6.5.6 处理YUV视频源 502
6.6 音/视频编解码库FFmpeg 504
6.6.1 FFmpeg简介 504
6.6.2 核心结构体与常用API 505
6.6.3 与SDL结合实现简单的播放器 511