书籍详情
高质量嵌入式Linux C编程
作者:梁庚、陈明、马小陆 编著
出版社:电子工业出版社
出版时间:2015-01-01
ISBN:9787121253836
定价:¥68.00
购买这本书可以去
内容简介
本书从嵌入式开发角度出发,以Linux操作系统为开发平台,将隐藏在系统开发背后的关于C语言、计算机组成原理、计算机操作系统等方面的机制和知识娓娓道来,不仅能让读者知其然,更要让读者知其所以然,揭开嵌入式Linux C系统开发背后鲜为人知的秘密,并让这些知识再反作用于编程实践,从而帮助读者写出高质量的嵌入式Linux C代码。具体说来,本书主要讨论了包括嵌入式C语言高级编程、嵌入式Linux系统编程、多任务解决机制、网络编程等多个方面的话内容。
作者简介
暂缺《高质量嵌入式Linux C编程》作者简介
目录
目 录第1章 嵌入式Linux C语言开发工具11.1 嵌入式Linux C语言开发概述11.2 嵌入式Linux C开发环境11.3 嵌入式文本编辑器21.3.1 基本模式21.3.2 基本操作31.3.3 实训操作51.4 嵌入式编译器61.4.1 初识GCC编译器61.4.2 gcc命令常用选项及工作流程61.4.3 库的使用101.5 嵌入式调试器121.6 工程管理器151.6.1 Makefile161.6.2 Makefile特性介绍181.7 Eclipse程序开发261.7.1 Eclipse环境安装261.7.2 Eclipse C程序开发28第2章 数据类型352.1 变量与常量352.2 变量352.2.1 什么是变量352.2.2 变量名和变量值362.2.3 局部变量和全局变量382.3 常量402.4 基本内置类型412.4.1 数据类型大小422.4.2 陷阱之有符号与符号422.5 声明与定义432.5.1 定义432.5.2 声明432.6 乱世枭雄:static与extern442.6.1 政权旗帜static442.6.2 外来的和尚会念经extern452.7 铁布衫:const472.8 隐形刺客:auto482.9 闪电飞刀:register492.10 专一王子:volatile502.11 typedef详解512.11.1 typedef与结构的问题512.11.2 typedef与#define的问题532.11.3 typedef与#define的另一例532.11.4 typedef与复杂的变量声明542.12 枚举552.12.1 枚举类型的使用方法552.12.2 枚举与#define 宏的区别562.13 联合体562.13.1 联合体的定义562.13.2 从两道经典试题谈联合体(union)的使用57第3章 运算符、表达式593.1 运算符简介593.1.1 运算符优先级593.1.2 一些容易出错的优先级问题613.1.3 逻辑运算符613.2 条件运算符和条件表达式623.3 ++、操作符633.4 位运算643.4.1 按位与运算及应用643.4.2 按位或运算及应用643.4.3 按位异或运算及应用653.4.4 左移和右移653.5 C语言性能优化:使用位操作65第4章 语句674.1 空语句674.2 基础语句684.2.1 表达式语句684.2.2 函数调用语句684.3 语句if684.3.1 布尔变量与零值比较694.3.2 整型变量与零值比较694.3.3 浮点变量与零值比较694.3.4 指针变量与零值比较704.3.5 对if语句的补充说明704.4 跳转语句:goto704.5 循环语句714.5.1 do-while语句724.5.2 for语句724.5.3 循环语句的效率744.6 break和continue754.6.1 break语句754.6.2 continue语句754.7 switch语句77第5章 数组与指针795.1 数组认知795.2 使用数组之常见问题805.2.1 数组的下标总是从0开始吗805.2.2 可以使用数组后面第一个元素的地址吗815.2.3 为什么要小心对待位于数组后面的那些元素的地址呢825.2.4 数组作为参数传递给函数时,可以通过sizeof得到数组的大小吗825.2.5 指针或带下标的数组名都可以访问元素,哪一种更好呢835.2.6 可以把另外一个地址赋给一个数组名吗855.2.7 array_name和&array_name有什么不同865.2.8 为什么用const说明的常量不能用来定义一个数组的初始大小875.2.9 字符串和数组有什么不同875.3 指针895.3.1 指针是变量905.3.2 指针的类型和指针所指向的类型905.3.3 指针的值915.3.4 指针本身所占据的内存区915.4 指针的运算925.4.1 指针的算术运算925.4.2 指针的关系运算925.4.3 间接引用935.4.4 最多可以使用几层指针935.5 常量指针和指针常量955.5.1 常量指针与指针常量的实例955.5.2 常量指针的应用965.6 空指针及其使用975.6.1 NULL总是被定义为0吗975.6.2 NULL总是等于0吗975.6.3 空指针的使用985.7 指针void:万能指针995.8 指针数组与数组指针1005.9 字符串函数详解1015.10 函数指针与指针函数1055.11 复杂指针声明:“int * (* (*fp1) (int) ) ;”1065.11.1 基础1065.11.2 const修饰符1075.11.3 typedef的妙用1085.11.4 函数指针1095.11.5 右左法则109第6章 内存管理1116.1 你的数据放在哪里1116.1.1 未初始化的全局变量(.bss段)1116.1.2 初始化过的全局变量(.data段)1126.1.3 常量数据(.rodata段)1126.1.4 代码(.text段)1136.1.5 栈(stack)1136.1.6 堆(heap)1136.2 内存分配方式1146.3 野指针1156.4 常见的内存错误及对策1156.5 段错误以及调试方法1166.5.1 方法一:利用gdb逐步查找段错误1176.5.2 方法二:分析core文件1186.5.3 方法三:段错误时启动调试1196.5.4 方法四:利用backtrace和objdump进行分析1206.6 指针与数组的对比121第7章 预处理、结构体1257.1 宏定义:#define1257.1.1 参宏定义1257.1.2 带参宏定义1277.2 文件包含1287.3 条件编译1297.4 宏定义使用技巧1317.5 关于#和##1327.6 结构体1337.6.1 内存字节对齐1357.6.2 内存对齐正式原则1387.7 #define和typedef的区别1397.8 结构体和联合体的区别1397.9 浅谈C语言中的位段1397.9.1 位段的使用1407.9.2 位段结构在内存中的存储方式140第8章 函数1418.1 函数声明与定义1418.1.1 定义1418.1.2 声明与定义不同1428.2 形式参数和实际参数1438.3 参数传递1438.3.1 简单变量或数组元素作为函数参数1438.3.2 指针变量或数组名作为函数参数1448.3.3 数组名作函数参数1458.3.4 结构体数组作函数参数1468.4 如何编写有多个返回值的C语言函数1468.4.1 利用全局变量1468.4.2 传递数组指针1488.4.3 传递结构体指针1488.5 回调函数1498.6 变参函数详解:printf的实现1518.7 可变参数问题152第9章 编码规范1559.1 排版1559.2 注释1589.3 标示符名称163第10章 shell编程16510.1 什么是shell16510.2 几种流行的shell16510.3 shell程序设计(基础部分)16610.3.1 shell基本语法16610.3.2 shell程序的变量和参数16710.4 shell程序设计的流程控制16910.4.1 test测试命令16910.4.2 if条件语句17010.4.3 for循环17110.4.4 while和until循环17110.4.5 case条件选择17210.4.6 条件控制语句break和continue17310.4.7 函数定义17310.5 命令分组17410.6 信号17410.7 运行shell程序的方法17510.8 bash程序的调试17510.9 bash的内部命令176第11章 文件操作17911.1 Linux文件结构17911.1.1 Linux文件系统17911.1.2 Linux目录结构18011.1.3 Linux文件分类18211.1.4 常见文件类型18311.1.5 Linux文件属性18311.2 系统调用18411.3 Linux文件描述符18411.4 不带缓存的I/O操作18511.4.1 creat函数18511.4.2 open函数18611.4.3 read函数18811.4.4 write函数18911.4.5 lseek函数18911.4.6 close函数18911.4.7 经典范例:文件复制19011.5 带缓存的I/O操作19111.5.1 三种类型的缓冲19111.5.2 fopen函数19311.5.3 fclose函数19411.5.4 fdopen函数19411.5.5 fread函数19511.5.6 fwrite函数19511.5.7 fseek函数19611.5.8 fgetc函数、getc函数和getchar函数19711.5.9 fputc函数、putc函数和putchar函数19811.6 fgets函数与gets函数比较分析19911.7 输出与输入20111.7.1 printf函数、fprintf函数和sprintf函数20111.7.2 scanf函数、fcanf函数和sscanf函数203第12章 进程控制编程20712.1 为何需要多进程(或者多线程),为何需要并发20712.1.1 进程20712.1.2 进程分类20812.1.3 进程的属性20812.1.4 父进程和子进程20812.2 Linux进程管理20912.2.1 ps监视进程工具20912.2.2 pgrep查询进程工具21112.2.3 终止进程的工具kill、killall、pkill、xkill21112.2.4 top监视系统任务的工具21312.2.5 进程的优先级:nice和renice21412.3 Linux进程的三态21512.3.1 三种基本状态21512.3.2 三种状态间的转换21512.4 Linux进程结构21612.5 Linux进程控制块PCB21612.6 Linux进程调度21812.6.1 调度的目标21812.6.2 调度算法21812.6.3 优先级反转22012.7 进程创建22112.7.1 获取进程22112.7.2 启动进程:fork( )22212.7.3 启动进程:vfork( )22412.7.4 启动进程:exec族22512.7.5 启动进程:system22812.8 进程等待22912.8.1 僵尸进程的产生22912.8.2 如何避免僵尸进程23112.8.3 wait函数和waitpid函数23112.9 进程退出23512.9.1 退出方式的不同点23612.9.2 exit( )和_exit( )函数23612.9.3 exit( )和_exit( )的区别237第13章 进程间通信方式23913.1 进程间通信方式概述23913.1.1 进程间通信的目的23913.1.2 Linux进程间通信方式简介24013.2 管道通信24113.2.1 建立名管道24113.2.2 读写名管道24213.2.3 名管道应用实例24613.2.4 创建有名管道24813.2.5 读写有名管道25013.3 管道通信方式的应用场景25313.4 信号25413.4.1 信号及信号来源25413.4.2 信号种类25413.4.3 信号处理方式25613.4.4 信号发送25613.4.5 自定义处理信号方式25813.4.6 信号集操作26213.4.7 使用信号注意事项26413.5 消息队列26513.5.1 消息队列基础理论26613.5.2 使用消息队列26613.5.3 消息队列API26713.5.4 消息队列的限制26913.5.5 消息队列的应用实例27013.6 信号灯27313.6.1 信号灯概述27313.6.2 内核实现原理27413.6.3 使用信号灯27413.6.4 信号灯API27513.6.5 信号灯的限制27713.6.6 竞争问题27713.6.7 信号灯应用实例27713.7 共享内存方式一28113.7.1 内核实现原理28113.7.2 mmap( )及其相关系统调用28213.7.3 mmap( )范例28313.7.4 对mmap( )返回地址的访问28713.8 共享内存方式二28913.8.1 系统V共享内存原理28913.8.2 系统V共享内存API29013.8.3 系统V共享内存范例291第14章 多线程编程29514.1 线程概述29514.1.1 为什么有了进程的概念后,还要再引入线程呢29514.1.2 多线程的优点29614.1.3 多线程的缺点29614.2 多线程的实现29714.2.1 线程的创建29714.2.2 终止线程29914.2.3 等待线程终止30014.3 线程属性30014.3.1 线程属性初始化30114.3.2 线程分离30114.3.3 线程的继承性30214.3.4 线程的调度策略30314.3.5 线程的调度参数30414.3.6 实例分析30514.4 线程同步机制30614.4.1 互斥锁Mutex30614.4.2 互斥锁使用实例30814.4.3 条件变量Conditions31014.4.4 条件变量使用实例311第15章 网络编程31315.1 TCP/IP协议概述31315.1.1 TCP/IP 起源31315.1.2 TCP/IP的特性与应用31515.1.3 互联网地址31515.1.4 域名系统31615.1.5 封装31715.1.6 TCP/IP工作模型31815.1.7 TCP/IP 协议层31815.1.8 TCP/IP应用32015.1.9 网桥、路由器和网关32115.2 TCP和UDP32215.2.1 TCP协议32215.2.2 三次握手协议32215.2.3 TCP数据报头32315.2.4 UDP协议32415.2.5 协议的选择32415.2.6 IP和端口号32415.3 套接字32515.3.1 Socket概念32515.3.2 Socket类型32515.3.3 Socket信息数据结构32515.3.4 数据存储优先顺序的转换32615.3.5 地址格式转化32715.3.6 名字地址转化32815.4 网络编程33015.4.1 建立Socket33115.4.2 绑定地址33215.4.3 监听33315.4.4 接受请求33415.4.5 连接服务器33515.4.6 发送数据33515.4.7 接收数据33615.5 采用TCP协议的C/S架构实现33815.5.1 模块封装33815.5.2 服务器的实现34015.5.3 客户端的实现34115.6 并发服务器模型34215.6.1 多进程解决方案34215.6.2 多线程解决方案34215.6.3 调用fcntl将sockfd设置为非阻塞模式34815.7 多路转接模型34815.7.1 服务器的实现34915.7.2 客户端的实现35415.8 采用UDP协议C/S架构的实现35515.8.1 服务器的实现35515.8.2 客户端的实现35615.8.3 UDP协议传输文件的实现357参考文献360
猜您喜欢