标题：嵌入式GUI开发设计:基于MiniGUI
本书特点：
基于处于快速发展阶段的MiniGUI系统，由权威培训机构为读者解读MiniGUI3.0新技术的应用。
结合了GUI理论和MiniGUI系统的实现，让读者同时从广度和深度上对嵌入式GUI乃至嵌入式系统有深入的了解。
提供了详尽的配套光盘，包含大量的源代码和应用，可使读者具备快速搭建系统的能力，并能快速上手，搭建自己的系统。
书中包含众多事例，可操作性、可扩展性强，能充分发挥读者的想象力。
内 容 简 介
《嵌入式GUI开发设计——基于MiniGUI》是一本嵌入式图形用户系统应用开发方面的教程，由作者韩超结合飞漫官方授权资料编著。本书通过介绍MiniGUI系统的开发，给读者一个学习嵌入式GUI程序设计和实现的平台。MiniGUI系统是一个由中国人实现、目前广泛在应用的优秀嵌入式GUI系统，通过这个系统的学习，可以了解嵌入式GUI开发的思想和方法，也可以加深对嵌入式系统开发的理解。本书结合嵌入式GUI系统的通用知识对MiniGUI系统进行了充分的介绍，篇幅控制详略得当，配合光盘使用，可以达到事半功倍的效果。本书主体分成三个层次：MiniGUI的架构、MiniGUI的各种功能、基于MiniGUI构建应用程序，这是学习嵌入式GUI系统较为便捷和高效的方式。
前 言
时至今日，MiniGUI已经走过了十年的路程。目前的MiniGUI已经成为一套具有完整清晰定义的移植层、优秀的窗口管理机制、丰富而易用的控件并可以进行外观定制的嵌入式GUI系统；在上层的组件中，MiniGUI还包含了3D接口、输入法、打印甚至浏览器等组件。从一款默默无闻的小型GUI程序，到现在成为全球嵌入式软件领域的鼎鼎大名的软件。对于中国人来说，MiniGUI所承载不仅仅是一款软件的成功，更体现了中国人的东方式智慧完全有能力在世界的嵌入式软件行业中占据一席之地。可以肯定地说，MiniGUI的诞生和发展鼓舞了中国人在软件研发领域的热情，也坚定了中国人进入世界嵌入式软件开发前沿的信念。
MiniGUI的发展历程同时也从一个侧面体现了中国嵌入式技术的发展历程。MiniGUI的创始人魏永明先生等一批中国嵌入式技术的先驱引领了嵌入式技术在中国发展的潮流。自从1998年魏永明先生发布MiniGUI的第一个版本开始，这个项目就一直吸引并带领着来自不同专业、不同领域的国人进入了嵌入式技术的世界。作为一个交叉学科，嵌入式系统的技术需要综合性的人才，MiniGUI的发展吸引了更多人进入这个领域。作为一个嵌入式的GUI系统，MiniGUI的开发让人们更多熟悉了嵌入式系统的开发流程。在这个过程中，嵌入式技术的门槛对于大众降低了很多，以前某些只有研发企业和高校才有能力开发的项目，现在普通的爱好者也可以参与开发。更多人的参与同时也促进嵌入式技术在中国有了更好的发展。
从MiniGUI的开源版本中，我们深刻地感受到了这个中国人自己创作的一套完整嵌入式GUI系统的魅力。随着对MiniGUI的学习，很多人在数年之前进入了嵌入式系统领域，他们当中很多人成为了现今中国大陆地区嵌入式技术的中坚。在对MiniGUI的关注中，每一个从事嵌入式研发相关的人员都可以得到丰富的收获，从API的制定、为移植构建的抽象层、代码组织、软件组织架构乃至整个嵌入式系统中间件的架构。
飞漫公司的成立也已经有6个年头了，MiniGUI在飞漫公司的运作中得到了更大的发展。在这个过程中，我们欣喜地看到MiniGUI并没有像很多纯粹的技术产品一样虎头蛇尾，而是在开源版本和商业版本双线上成功地发展。MiniGUI同时具有了开源软件开放性的特点和商业软件高品质的特点。
作为一款软件产品，MiniGUI的商业版本使得MiniGUI得到了长足的进展，让MiniGUI稳定地运行到了更多的设备上。目前，MiniGUI在小型嵌入式上面的移植具有无可比拟的优势。对比同类的嵌入式GUI系统，MiniGUI不仅性能开销较低，而且明显具有更强的可移植性和可配置性。MiniGUI可以灵活提供各种功能定制：小到简单的图形绘制库，大到整个系统的解决方案。由于MiniGUI系统生根发芽的土壤在中国，它相比其他的GUI系统更适合由中国人来开发。目前MiniGUI在中高端手机、PDA类产品、机顶盒、智能家居以及工控、仪表领域都有了广泛的应用。
尤其值得指出的是，虽然飞漫是一家研发软件产品的公司，但是魏永明先生带领飞漫团队对中国技术界本着非常负责任的态度，依然在进行着一定程度的技术传播和交流，这也很大程度上促进了嵌入式软件技术的提高。飞漫的成功也给了中国软件业发展一个很好的启迪。
MiniGUI在稳定发展了若干年后，目前最新的版本为MiniGUI3.0。此时的MiniGUI在接口上已经基本稳定，但也具有了很强的扩展性。MiniGUI正向着可以提供整套的解决方案、友好的开发环境、并且可以接受第三方的应用的方向发展。飞漫的定制模式也让基于MiniGUI的软件开发的分工更加明确，这样可以使基于MiniGUI的产品具有更快更好的开发效率。MiniGUI的发展历程不仅是技术上的发展，也带来了对行业产业链和发展模式的思考。
本书通过介绍MiniGUI系统的开发，给读者展示一个学习GUI系统程序的平台。本书的内容可以体现两个层次的内容：其一是对MiniGUI的应用程序开发的学习，读者可以通过对照光盘中的程序学习本书的内容，在学习之后可以单独进行MiniGUI应用程序的开发；其二是对GUI系统程序设计思想的学习，虽然MiniGUI系统和其他GUI系统存在差异，但是GUI系统整体设计的思想是通用的，读者根据本书的内容学习并进行思考后，在开发其他的GUI系统的时候也可以快速地上手。
对于一个GUI系统的学习，可以分成三个层次：第一个层次是了解GUI系统层次结构和程序框架；第二个层次是熟悉这个GUI系统所提供的功能；第三个层次是如何使用GUI系统构建完整的应用程序。
本书的第3章、第4章主要介绍了MiniGUI系统在第一个层次的内容。通过这两章的学习，读者可以熟悉MiniGUI系统的软件各个层次的关系，也可以学会如何使用MiniGUI构建一个简单的应用程序。
本书的第5章到第12章主要介绍了MiniGUI系统在第二个层次的内容。主要内容为MiniGUI主窗口、对话框、控件的使用、GDI编程以及其他一些方面的内容。其中，主窗口、对话框和控件的使用三者构成了完成MiniGUI应用程序的主体；GDI名为图形设备接口，这是一组较低层次的API，GDI编程可以让读者深入控制系统，进行更灵活的程序设计；其他方面的内容包括菜单、键盘和鼠标处理、图标、光标、定时器等内容。第12章单独介绍了MiniGUI扩展库的内容，包括扩展的对话框、控件和皮肤等功能。
本书的第13章到第16章主要介绍了MiniGUI系统在第三个层次的内容。这些章节通过展示MiniGUI演示库的例子，让读者学习使用MiniGUI提供的接口构建完成的应用程序。这些简单的应用程序可以体现GUI系统设计的一些思路。
本书既适合需要进入MiniGUI应用程序开发领域的人员，也适合需要学习通用的GUI技术的人员。MiniGUI系统是一个目前广泛应用的嵌入式GUI系统，可以通过学习这个系统进入GUI程序开发的领域。本书要求读者具有C语言编程的一定基础。本书的开发环境可以使用Ubuntu、Fedora或OpenSuse等Linux发行版，需要安装了GCC、make等基本的工具，然后可以根据本书提供的光盘建立开发环境。本书光盘中也提供了部分Windows中的开发环境，可以在Windows的Visual C++6.0环境中使用。
在本书的学习过程中，为了取得事半功倍的效果，读者可以使用边学边练的方式，对于书中的示例程序，应对照光盘中的程序或自己练习编写程序进行验证和扩展。由于各个控件的使用相似性较多，本书只选取了具有代表性的进行介绍，并在附录中列出了控件的特性。读者可以通过参考MiniGUI的API手册和头文件中的描述，自己编写程序进行更多的练习。对于完整GUI程序的组织，读者应根据自身需要完成软件的需求，结合一般软件工程的思想和MiniGUI接口的特点进行设计和实现。此外，MiniGUI的API大都是通过深思熟虑发布的，具有简洁、含义明确和便于扩展的特点，读者在这方面进行思考，可以提高自身软件工程的思想。
本书由韩超规划和编著，北京飞漫软件技术有限公司为本书提供了丰富的资料。本书的配套光盘由韩超组织完成，其中部分内容依据北京飞漫软件技术有限公司授权加入。在本书及其配套光盘的编著过程中，亚嵌嵌入式教育研究中心为本书提供了支持，郎铁山、王旭光参与了审校工作。本书的出版也是飞漫多年技术积累的成果。本书作者和参与编著人员长期立志于推广嵌入式技术，努力促进公众的技术共同进步。由于时间仓促，本书可能依然存在一些错误和问题，请读者见谅。MiniGUI的发展需要广大的技术人员共同参与，欢迎读者讨论和指点。
作 者 
2008，北京
目 录
第1章 嵌入式GUI系统概述 11.1 嵌入式GUI系统 1
1.1.1 嵌入式GUI系统的作用 1
1.1.2 嵌入式GUI系统的层级结构 2
1.2 嵌入式GUI系统的设计原则 4
1.3 嵌入式GUI系统发展状况 6
1.3.1 QT/Embedded 6
1.3.2 Microwindows 7
1.3.3 MiniGUI 8
第2章 MiniGUI的特点和发展 92.1 MiniGUI与嵌入式GUI系统 9
2.1.1 MiniGUI的设计理念 9
2.1.2 MiniGUI与其他嵌入式GUI
2.1.2 系统的比较 12
2.2 MiniGUI的发布版本 14
2.2.1 MiniGUI 1.6 15
2.2.2 MiniGUI 2.0 16
2.3 MiniGUI 3.0 19
2.3.1 MiniGUI 3.0核心库的新功能 19
2.3.2 MiniGUI 3.0的新组件 19
2.4 MiniGUI的展望 20
2.4.1 MiniGUI的集成开发环境mStudio 20
2.4.2 MiniGUI 4.0 21
2.5 MiniGUI的发展和应用 21
2.5.1 MiniGUI的发展 21
2.5.2 MiniGUI的应用领域 23
第3章 MiniGUI的体系结构 263.1 MiniGUI的结构概述 26
3.2 MiniGUI的系统需求 29
3.2.1 MiniGUI所支持的操作系统 29
3.2.2 MiniGUI所支持的硬件平台 29
3.2.3 MiniGUI对系统资源的占用情况 29
3.3 MiniGUI的层次结构 29
3.3.1 MiniGUI的移植层 29
3.3.2 MiniGUI的核心实现 31
3.3.3 MiniGUI的API 32
3.4 MiniGUI的运行模式 34
3.4.1 MiniGUI-Threads模式 35
3.4.2 MiniGUI-Processes模式 36
3.4.3 MiniGUI-Standalone模式 38
第4章 MiniGUI的程序框架 394.1 GUI程序设计的基本方式 39
4.1.1 程序中的消息机制 39
4.1.2 回调函数的使用 40
4.2 程序示例与分析 42
4.2.1 MiniGUI的HelloWorld程序示例 42
4.2.2 程序分析 45
第5章 MiniGUI的窗口与消息机制 505.1 MiniGUI的窗口系统 50
5.1.1 窗口系统的概念 50
5.1.2 MiniGUI窗口系统 51
5.2 MiniGUI的消息处理机制 52
5.2.1 消息机制的概念 52
5.2.2 MiniGUI的消息机制 52
5.2.3 MiniGUI的消息机制类型 54
5.3 主窗口及其消息处理编程 55
5.3.1 主窗口的信息隐藏和对象编程 55
5.3.2 在主窗口中使用的附加信息 56
5.3.3 消息处理的方式与自定义消息 57
5.3.4 较完整的消息处理 59
5.3.5 主窗口及其消息处理的设计思想和编程内容总结 65
第6章 MiniGUI的对话框编程 676.1 MiniGUI中的对话框 67
6.1.1 对话框的概念 67
6.1.2 MiniGUI的对话框的使用方式 67
6.2 MiniGUI对话框编程 72
6.2.1 使用对话框模版编程 72
6.2.2 非模式对话框的使用 75
6.2.3 主窗口和对话框的结合使用 79
6.2.4 对话框的设计思想和编程内容总结 83
第7章 MiniGUI的控件编程 847.1 MiniGUI中的控件 84
7.1.1 控件的概念 84
7.1.2 MiniGUI的控件的使用方式 85
7.2 MiniGUI中的控件基本编程 90
7.2.1 使用控件的简单示例Hello World 90
7.2.2 多控件的使用 91
7.2.3 控件通知函数使用 94
7.2.4 控件的设计思想和编程内容总结 98
7.3 MiniGUI中的控件高级编程 98
7.3.1 自定义控件的编程 98
7.3.2 控件子类化 101
7.3.3 MiniGUI中的控件高级编程内容总结 104
第8章 MiniGUI的菜单 1068.1 MiniGUI中的菜单 106
8.1.1 菜单的概念 106
8.1.2 MiniGUI中菜单的概念 106
8.2 MiniGUI中的编程 111
8.2.1 菜单的编程示例 111
8.2.2 菜单的设计思想和要点 117
第9章 MiniGUI的键盘和鼠标 1199.1 MiniGUI中的输入设备的概念 119
9.1.1 输入的基本概念 119
9.1.2 MiniGUI的输入 119
9.2 MiniGUI中的键盘编程 120
9.2.1 键盘输入的过程 120
9.2.2 键盘的消息 120
9.2.3 键盘的状态和输入焦点的信息 122
9.2.4 键盘示例程序 123
9.2.5 键盘编程要点总结 126
9.3 MiniGUI中的鼠标 126
9.3.1 鼠标输入的过程 126
9.3.2 鼠标消息 127
9.3.3 鼠标捕获问题 129
9.3.4 鼠标编程示例 129
9.2.5 鼠标编程要点总结 133
第10章 MiniGUI的GDI编程 13410.1 GUI系统中的图形设备 134
10.1.1 图形设备在GUI中的作用 134
10.1.2 MiniGUI中的GDI概念 134
10.2 MiniGUI中窗口绘制和刷新 135
10.2.1 何时进行绘制 135
10.2.2 MSG_PAINT消息 136
10.2.3 有效区域和无效区域 137
10.3 图形设备上下文 137
10.3.1 图形设备的抽象 137
10.3.2 设备上下文句柄的获取和释放 139
10.3.3 设备上下文句柄的保存和恢复 141
10.3.4 系统内存中的设备上下文 141
10.3.5 屏幕设备上下文 141
10.3 映射模式和坐标空间 141
10.3.1 映射模式 141
10.3.2 视口和窗口 142
10.3.3 设备坐标的转换 143
10.3.4 坐标系的偏移和缩放 144
10.4 颜色与调色板 144
10.4.1 颜色与调色板的概念 144
10.4.2 有关颜色的接口 146
10.4.3 颜色处理的示例程序 148
10.5 在图形设备的绘制基本图形 150
10.5.1 矩形操作 150
10.5.2 基本绘图属性 150
10.5.3 基本绘图函数 151
10.5.3 基本绘图程序示例 152
10.6 位图的使用 155
10.6.1 位图的概念 155
10.6.2 位图的装载 157
10.6.3 位图的绘制 158
10.6.4 位图程序示例 159
10.7 文本的处理和显示 160
10.7.1 字符集和编码 161
10.7.2 设备字体 162
10.7.3 逻辑字体 162
10.7.4 文本输出 163
10.7.5 文本程序示例 164
第11章 MiniGUI其他方面的编程 16711.1 图标编程 167
11.1.1 图标的文件接口 167
11.1.2 图标的创建 169
11.1.3 系统图标的使用 169
11.1.4 图标的示例程序 170
11.1.5 图标编程要点总结 171
11.2 光标编程 172
11.2.1 光标的文件接口 172
11.2.2 光标限定 174
11.2.3 光标的创建 174
11.2.4 系统光标的使用 175
11.2.5 光标的示例程序 175
11.2.6 光标编程要点总结 177
11.3 定时器的使用 178
11.3.1 定时器的作用 178
11.3.2 MiniGUI中的定时器编程 178
11.3.3 定时器的程序示例 179
11.3.4 定时器编程的要点总结 180
第12章 MiniGUI扩展库的相关第12章 内容 181

附录B MiniGUI的扩展控件 284
第一部分 基础知识第1章 Linux环境下C语言的开发 2
1.1 Linux下的C语言开发环境 2
1.2 在Linux中使用C语言开发 3
1.2.1 开发流程和开发工具 3
1.2.2 Linux中程序的运行原理 4
第2章 嵌入式环境中的C语言开发 7
2.1 嵌入式C语言的开发环境 7
2.2 嵌入式开发中C语言编程要点 9
第二部分 Linux环境中C语言的开发环境和工具
第3章 Linux的文本编辑工具VI 12
3.1 VI编辑器概述 12
3.1.1 VI简介 12
3.1.2 VI的工作模式和使用
3.1.2 之前的准备 12
3.1.3 进入和退出VI 13
3.2 VI的增强版VIM 16
3.3 VI编辑器的基本使用方法 17
3.3.1 在屏幕上移动光标 17
3.3.2 插入文本 20
3.3.3 删除文本 22
3.3.4 修改文本内容 25
3.3.5 替换文本内容 27
3.3.6 合并文本内容 30
3.3.7 移动文本内容 30
3.4 VI编辑器的命令和高级操作 32
3.4.1 VI常用命令的列表 32
3.4.2 VI的一些高级的操作和
3.1.2 使用技巧 35
第4章 GCC程序开发工具 39
4.1 GNU工具综述 39
4.2 GCC的编译和连接 43
4.2.1 工程示例 43
4.2.2 编译、汇编和连接 46
4.2.3 动态库 48
4.3 GCC的二进制工具 49
4.3.1 ar（归档工具） 49
4.3.2 readelf（读取ELF格式
3.1.2 文件信息） 51
4.3.3 strings（查看字符串） 54
4.3.4 nm（显示符号信息） 55
4.3.5 strip（删除符号） 57
4.3.6 objdump（显示目标
3.1.2 文件信息） 58
4.3.7 objcopy（复制目标文件） 63
第5章 make工程管理工具 67 5.1 make和Makefile 67
5.1.1 make机制概述 67
5.1.2 make和Makefile的使用 68
5.2 Makefile使用示例 69
5.2.1 简单的Makefile 69
5.2.2 Makefile中的依赖关系 71
5.2.3 Makefile中使用隐含规则
5.2.4 Makefile中指定依赖关系的
3.1.2 编译 76
5.3 自动生成Makefile 78
5.3.1 自动生成Makefile的意义和
3.1.2 相关工具 78
5.3.2 自动生成Makefile的流程 79
第6章 GDB调试工具 85
6.1 GDB简介 85
6.2 使用GDB调试程序 86
6.2.1 基本操作 88
6.2.2 查看命令 90
6.2.3 高级命令 92
6.2.4 attach命令的使用 94
6.3 远程GDB调试 95
6.3.1 本地GDB调试和远程GDB
3.1.2 调试的比较 95
6.3.2 远程GDB调试流程 97
6.3.3 远程GDB调试示例 98
第三部分 库函数第7章 C语言标准库函数 106
7.1 ISO的C语言标准库函数
7.1 分类 106
7.2 标准格式化输入/输出类函数 107
7.2.1 scanf函数：格式化输入字符串 107
7.2.2 printf函数：格式化输出字符串 109
7.2.3 putchar函数：输出字符到标准输出 111
7.2.4 getchar函数：从标准输入获取字符 111
7.2.5 putc函数：向文件输出字符 112
7.2.6 getc函数：从文件输入字符 112
7.2.7 gets函数：获得字符串 112
7.2.8 puts函数：输出指定字符串 113
7.2.9 ungetc函数：把字符
3.1.2 写回流中 113
7.3 字符处理类函数 114
7.4 字符串处理及转换函数 116
7.4.1 sprintf函数：格式化输出
3.1.2 字符串到一个缓冲区 116
7.4.2 strcat和strncat函数： 字符串连接 119
7.4.3 strcpy和strncpy函数：字符串复制 120
7.4.4 strcmp和strncmp函数：字符串比较 121
7.4.5 strlen函数：获取字符串长度 122
7.4.6 strchr和strrchr函数：字符/字符串定位 122
7.4.7 strstr函数：字符串查找 123
7.4.8 strrev函数：字符串逆序 124
7.4.9 strupr和strlwr函数：字母形式转换 125
7.4.10 strdup和strndup函数：字符串复制 125
7.4.11 memset函数：内存设置 126
7.4.12 memmove函数：内存移动 126
7.4.13 memcmp函数：内存比较 127
7.4.14 memcpy函数：内存复制 128
7.5 数学计算类函数 128
7.6 数据结构和算法类函数 133
7.6.1 bsearch函数：二元搜索 133
7.6.2 lfind函数：线性搜索 134
7.6.3 lsearch函数：线性搜索 135
7.6.4 qsort函数：利用快速排序法排列数组 136
7.6.5 rand函数：产生随机数 136
7.6.6 srand函数：设置随机数种子 137
7.7 文件I/O操作类相关函数 137
7.7.1 fopen函数：打开文件 138
7.7.2 fclose函数：关闭文件 139
7.7.3 fgetc函数：从文件中读取一个字符 139
7.7.4 fputc函数：将一指定字符写入文件流中 139
7.7.5 fgets函数：从文件中读取 一字符串 140
7.7.6 fputs函数：将一指定的字符串写入文件内 140
7.7.7 rewind函数：重设文件流的读写位置为文件开头 141
7.7.8 ftell函数：取得文件流的读取位置 141
7.7.9 fseek函数：移动文件流的读写位置 141
7.7.10 fwrite函数：将数据写至文件流 142
7.7.11 fread函数：从文件流读取数据 142
7.7.12 remove函数：删除文件 143
7.7.13 rename函数：更改文件名称或位置 143
7.7.14 freopen函数：重新打开文件 144
7.7.15 fflush函数：同步缓冲区 144
7.7.16 fgetpos函数：获得文件位置 145
7.7.17 fsetpos函数：设置文件位置 145
7.7.18 mktemp函数：建立临时文件 146
7.7.19 tmpfile函数：临时文件 146
7.7.20 tmpnam：得到临时文件名 147
7.8 日期时间类函数 147
7.8.1 clock函数：获得CPU时间 148
7.8.2 time函数：获得当前日历时间 148
7.8.3 difftime函数：获得时间差值 148
7.8.4 gmtime函数：将日历时间转换成UTC时间 149
7.8.5 mktime函数：将UTC时间转换成日历时间 149
7.8.6 asctime函数：将UTC时间转换成字符串 149
7.8.7 ctime函数：将日历时间转换成当地时间的字符串 150
7.8.8 localtime函数：将日历时间转换成本地时间 150
7.8.9 strftime函数：转换日期和时间格式 151
7.9 国际化和本地化函数 152
7.9.1 setlocale函数：本地化控制函数 153
7.9.2 localeconv函数：本地化转换 154
7.10 错误处理类函数 155
7.10.1 clearerr函数：清除流中的
7.10.1 结束指示符和错误指示符 155
7.10.2 feof函数：指示文件结束 155
7.10.3 ferror函数：指示文件出错 156
7.10.4 perror函数：输出出错信息 156
7.10.5 errno函数：错误编号记录 156
7.11 其他一些工具函数 157
7.11.1 assert函数：程序诊断 157
7.11.2 长跳转函数 157
7.11.3 可变长的参数控制函数 160
7.11.4 获取结构体成员函数（宏） 161
7.12 一些标准库中有用的宏 161
第8章 Linux中C语言的扩展库函数 163
8.1 文件I/O操作函数 163
8.1.1 open函数：打开文件 163
8.1.2 close函数：关闭文件 164
8.1.3 read函数：读文件 165
8.1.4 write函数：写文件 165
8.1.5 lseek函数：文件定位 167
8.1.6 ioctl函数：文件控制 167
8.1.7 flock函数：锁定文件 167
8.1.8 mmap函数和munmap函数：内存映射 168
8.1.9 create函数：创建新文件 170
8.1.10 dup函数和dup2函数：复制文件描述符 171
8.1.11 fcntl函数：改变已打开的文件的属性 171
8.2 文件权限相关的操作函数文件权限相关的操作函数 172
8.2.1 access函数：判断是否具有存取文件的权限 172
8.2.2 chown函数和fchown函数：改变文件的所有者 173
8.2.3 chmod函数和fchmod函数：改变权限 173
8.2.4 unlink函数：删除文件 173
8.2.5 utime函数和utimes函数：改变文件时间 174
8.2.6 umask函数：设置建立新文件时的权限掩码 175
8.2.7 link函数：建立文件连接 175
8.2.8 stat函数、fstat函数和lstat函数：获取文件信息 175
8.3 用户组操作函数 176
8.3.1 getgid函数和setgid函数：获得/设置组识别码 176
8.3.2 getegid函数和setegid函数：获得/设置有效的组识别码 177
8.3.3 getuid函数和setuid函数：获得/设置真实的用户识别码 177
8.3.4 geteuid函数和seteuid函数：获得/设置有效的用户识别码 178
8.3.5 getgroups函数和setgroups函数：获得/设置组代码 178
8.4 信号类函数 179
8.4.1 kill函数：传送信号给指定的进程 181
8.4.2 raise函数：信号发送函数 181
8.4.3 alarm函数：设置超时函数 182
8.4.4 signal函数：信号安装函数 182
8.5 进程处理函数 183
8.5.1 getpid函数和getppid函数：获得进程ID和父进程ID 183
8.5.2 fork函数：建立子进程 183
8.5.3 sleep函数和usleep函数：
8.2.1 让进程暂停执行一段时间 185
8.5.4 exec函数族：找到可执行文件 185
8.5.5 _ exit函数和_Exit函数：结束进程执行 188
第四部分 C语言高级编程第9章 动态内存的堆与栈 190
9.1 程序内存区域的使用 190
9.1.1 静态内存与动态内存 190
9.1.2 C语言中的动态内存 191
9.2 C程序中栈空间的使用 196
9.2.1 参数使用栈空间 196
9.2.2 自动变量使用栈空间 199
9.2.3 程序中较大的栈 201
9.2.4 栈空间的特性 202
9.3 C程序中的堆空间使用 203
9.3.1 分配和释放堆内存的库函数 203
9.3.2 库函数使用 204
9.3.3 堆内存的特性 218
9.4 堆内存和栈内存使用的比较 222
9.4.1 利用返回值传递信息 222
9.4.2 利用参数传递信息 226
9.4.3 堆与栈内存管理的区别 231
第10章 函数指针的使用 232
10.1 函数指针的概念 232
10.1.1 C语言函数的本质 232
10.1.2 函数指针在C语言中的
10.1.2 意义 234
10.2 函数指针的使用 237
10.2.1 函数指针使用初步 237
10.2.2 函数指针的类型定义 240
10.2.3 函数指针作为结构体成员 242
10.2.4 函数指针作为函数的参数 243
10.2.5 函数指针作为函数的
10.2.5 返回值 244
10.2.6 函数指针数组 246
10.3 函数指针使用示例 248
第11章 回调函数的使用 252
11.1 回调函数的概念与作用 252
11.1.1 程序调用的方式 252
11.1.2 回调函数的作用 254
11.2 回调函数的语法 254
11.2.1 简单的回调函数 254
11.2.2 完全形式的回调函数 256
11.3 回调函数的使用 259
11.3.1 qsort中的回调函数 259
11.3.2 atexit和on_exit函数的注册退出函数 263
第12章 C语言实现对象编程 268
12.1 C语言实现基于对象编程的概念与作用 268
12.2 C语言基于对象编程实现封装 269
12.2.1 简单的程序示例 269
12.2.2 C语言基于对象编程的详解 272
12.2.3 C语言基于对象编程与C++面向对象编程的对比 275
12.3 C语言基于对象编程实现部分继承功能 278
12.3.1 利用数据结构的包含实现继承功能 279
12.3.2 利用私有指针实现继承功能 282
12.3.3 C语言实现继承的总结 287
12.4 C语言基于对象编程实现
12.4 部分多态功能 288
12.4.1 利用操作指针组的包含实现多态功能 288
12.4.2 C语言实现多态功能的总结 292
12.5 对C语言实现基于对象
12.5 编程的思考 292
12.5.1 C语言基于对象编程的特性 292
12.5.2 C语言基于对象编程中接口、实现和调用者的关系 293
第五部分 在嵌入式环境下的C语言编程
第13章 C语言程序的内存布局 295
13.1 C语言程序的存储区域 295
13.2 C语言程序的段 297
13.2.1 段的分类 297
13.2.2 程序中段的使用 298
13.3 可执行程序的连接 301
13.3.1 可执行程序的组成 301
13.3.2 各个目标文件的关系 303
13.3.3 连接错误示例 304
13.4 C语言程序的运行 309
13.4.1 RAM调试运行 311
13.4.2 固化程序的XIP运行 312
13.4.3 固化程序的加载运行 313
13.4.4 C语言程序的运行总结 315
第14章 嵌入式C语言常用语法 317
14.1 内存指针操作 317
14.1.1 内存操作的意义 317
14.1.2 使用指针操作内存 319
14.1.3 volatile的使用 324
14.1.4 嵌入式系统指针的实际应用 325
14.2 位操作 327
14.2.1 位操作的意义 327
14.2.2 位操作的语法 328
14.3 大小端与对齐问题 330
14.3.1 大小端问题 331
14.3.2 内存对齐问题 335
14.3.3 结构体成员的对齐问题 338
14.4 程序的跳转 344
14.4.1 嵌入式系统程序跳转的类型 344
14.4.2 C语言中实现程序的跳转 345
第15章 嵌入式C语言编程的技巧 348
15.1 程序的优化技巧 348
15.1.1 循环缓冲区 348
15.1.2 查表法 350
15.1.3 针对循环执行效率的优化 353
15.2 关于小数运算 355
15.3 函数参数和返回值的传递 357
15.4 变量的初始化技巧 360
15.4.1 数组的初始化 360
15.4.2 结构体的初始化 362
15.4.3 变量的初始化总结 362
15.5 程序的调试和宏使用的技巧 363
15.5.1 打印文件、函数和程序行 363
15.5.2 #：字符串化操作符 364
15.5.3 ##：连接操作符 366
15.5.4 调试宏的第一种定义方式 367
15.5.5 调试宏的第二种定义方式 368
15.5.6 对调试语句进行分级审查 369
15.5.7 条件编译调试语句 370
15.5.8 使用do…while的宏定义 372
15.6 代码剖析 373
参考文献 378