高质量嵌入式Linux C编程

高质量嵌入式Linux C编程
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
作者:
2015-01
版次: 1
ISBN: 9787121253836
定价: 68.00
装帧: 平装
开本: 16开
纸张: 胶版纸
页数: 376页
字数: 600千字
正文语种: 简体中文
69人买过
  • 本书从嵌入式开发角度出发,以Linux操作系统为开发平台,将隐藏在系统开发背后的关于C语言、计算机组成原理、计算机操作系统等方面的机制和知识娓娓道来,不仅能让读者知其然,更要让读者知其所以然,揭开嵌入式Linux C系统开发背后鲜为人知的秘密,并让这些知识再反作用于编程实践,从而帮助读者写出高质量的嵌入式Linux C代码。具体说来,本书主要讨论了包括嵌入式C语言高级编程、嵌入式Linux系统编程、多任务解决机制、网络编程等多个方面的话内容。 魏清,男,工学硕士,毕业于南京邮电大学通信与信息系统专业,2011至今在苏嵌从事嵌入式项目的研究和培训工作,具有丰富的Linux驱动开发的经验。 目    录
    第1章  嵌入式Linux C语言开发工具 1
    1.1  嵌入式Linux C语言开发概述 1
    1.2  嵌入式Linux C开发环境 1
    1.3  嵌入式文本编辑器 2
    1.3.1  基本模式 2
    1.3.2  基本操作 3
    1.3.3  实训操作 5
    1.4  嵌入式编译器 6
    1.4.1  初识GCC编译器 6
    1.4.2  gcc命令常用选项及工作流程 6
    1.4.3  库的使用 10
    1.5  嵌入式调试器 12
    1.6  工程管理器 15
    1.6.1  Makefile 16
    1.6.2  Makefile特性介绍 18
    1.7  Eclipse程序开发 26
    1.7.1  Eclipse环境安装 26
    1.7.2  Eclipse C程序开发 28
    第2章  数据类型 35
    2.1  变量与常量 35
    2.2  变量 35
    2.2.1  什么是变量 35
    2.2.2  变量名和变量值 36
    2.2.3  局部变量和全局变量 38
    2.3  常量 40
    2.4  基本内置类型 41
    2.4.1  数据类型大小 42
    2.4.2  陷阱之有符号与符号 42
    2.5  声明与定义 43
    2.5.1  定义 43
    2.5.2  声明 43
    2.6  乱世枭雄:static与extern 44
    2.6.1  政权旗帜static 44
    2.6.2  外来的和尚会念经extern 45
    2.7  铁布衫:const 47
    2.8  隐形刺客:auto 48
    2.9  闪电飞刀:register 49
    2.10  专一王子:volatile 50
    2.11  typedef详解 51
    2.11.1  typedef与结构的问题 51
    2.11.2  typedef与#define的问题 53
    2.11.3  typedef与#define的另一例 53
    2.11.4  typedef与复杂的变量声明 54
    2.12  枚举 55
    2.12.1  枚举类型的使用方法 55
    2.12.2  枚举与#define 宏的区别 56
    2.13  联合体 56
    2.13.1  联合体的定义 56
    2.13.2  从两道经典试题谈联合体(union)的使用 57
    第3章  运算符、表达式 59
    3.1  运算符简介 59
    3.1.1  运算符优先级 59
    3.1.2  一些容易出错的优先级问题 61
    3.1.3  逻辑运算符 61
    3.2  条件运算符和条件表达式 62
    3.3  ++、操作符 63
    3.4  位运算 64
    3.4.1  按位与运算及应用 64
    3.4.2  按位或运算及应用 64
    3.4.3  按位异或运算及应用 65
    3.4.4  左移和右移 65
    3.5  C语言性能优化:使用位操作 65
    第4章  语句 67
    4.1  空语句 67
    4.2  基础语句 68
    4.2.1  表达式语句 68
    4.2.2  函数调用语句 68
    4.3  语句if 68
    4.3.1  布尔变量与零值比较 69
    4.3.2  整型变量与零值比较 69
    4.3.3  浮点变量与零值比较 69
    4.3.4  指针变量与零值比较 70
    4.3.5  对if语句的补充说明 70
    4.4  跳转语句:goto 70
    4.5  循环语句 71
    4.5.1  do-while语句 72
    4.5.2  for语句 72
    4.5.3  循环语句的效率 74
    4.6  break和continue 75
    4.6.1  break语句 75
    4.6.2  continue语句 75
    4.7  switch语句 77
    第5章  数组与指针 79
    5.1  数组认知 79
    5.2  使用数组之常见问题 80
    5.2.1  数组的下标总是从0开始吗 80
    5.2.2  可以使用数组后面第一个元素的地址吗 81
    5.2.3  为什么要小心对待位于数组后面的那些元素的地址呢 82
    5.2.4  数组作为参数传递给函数时,可以通过sizeof得到数组的大小吗 82
    5.2.5  指针或带下标的数组名都可以访问元素,哪一种更好呢 83
    5.2.6  可以把另外一个地址赋给一个数组名吗 85
    5.2.7  array_name和&array_name有什么不同 86
    5.2.8  为什么用const说明的常量不能用来定义一个数组的初始大小 87
    5.2.9  字符串和数组有什么不同 87
    5.3  指针 89
    5.3.1  指针是变量 90
    5.3.2  指针的类型和指针所指向的类型 90
    5.3.3  指针的值 91
    5.3.4  指针本身所占据的内存区 91
    5.4  指针的运算 92
    5.4.1  指针的算术运算 92
    5.4.2  指针的关系运算 92
    5.4.3  间接引用 93
    5.4.4  最多可以使用几层指针 93
    5.5  常量指针和指针常量 95
    5.5.1  常量指针与指针常量的实例 95
    5.5.2  常量指针的应用 96
    5.6  空指针及其使用 97
    5.6.1  NULL总是被定义为0吗 97
    5.6.2  NULL总是等于0吗 97
    5.6.3  空指针的使用 98
    5.7  指针void:万能指针 99
    5.8  指针数组与数组指针 100
    5.9  字符串函数详解 101
    5.10  函数指针与指针函数 105
    5.11  复杂指针声明:“int * (* (*fp1) (int) ) [10];” 106
    5.11.1  基础 106
    5.11.2  const修饰符 107
    5.11.3  typedef的妙用 108
    5.11.4  函数指针 109
    5.11.5  右左法则 109
    第6章  内存管理 111
    6.1  你的数据放在哪里 111
    6.1.1  未初始化的全局变量(.bss段) 111
    6.1.2  初始化过的全局变量(.data段) 112
    6.1.3  常量数据(.rodata段) 112
    6.1.4  代码(.text段) 113
    6.1.5  栈(stack) 113
    6.1.6  堆(heap) 113
    6.2  内存分配方式 114
    6.3  野指针 115
    6.4  常见的内存错误及对策 115
    6.5  段错误以及调试方法 116
    6.5.1  方法一:利用gdb逐步查找段错误 117
    6.5.2  方法二:分析core文件 118
    6.5.3  方法三:段错误时启动调试 119
    6.5.4  方法四:利用backtrace和objdump进行分析 120
    6.6  指针与数组的对比 121
    第7章  预处理、结构体 125
    7.1  宏定义:#define 125
    7.1.1  参宏定义 125
    7.1.2  带参宏定义 127
    7.2  文件包含 128
    7.3  条件编译 129
    7.4  宏定义使用技巧 131
    7.5  关于#和## 132
    7.6  结构体 133
    7.6.1  内存字节对齐 135
    7.6.2  内存对齐正式原则 138
    7.7  #define和typedef的区别 139
    7.8  结构体和联合体的区别 139
    7.9  浅谈C语言中的位段 139
    7.9.1  位段的使用 140
    7.9.2  位段结构在内存中的存储方式 140
    第8章  函数 141
    8.1  函数声明与定义 141
    8.1.1  定义 141
    8.1.2  声明与定义不同 142
    8.2  形式参数和实际参数 143
    8.3  参数传递 143
    8.3.1  简单变量或数组元素作为函数参数 143
    8.3.2  指针变量或数组名作为函数参数 144
    8.3.3  数组名作函数参数 145
    8.3.4  结构体数组作函数参数 146
    8.4  如何编写有多个返回值的C语言函数 146
    8.4.1  利用全局变量 146
    8.4.2  传递数组指针 148
    8.4.3  传递结构体指针 148
    8.5  回调函数 149
    8.6  变参函数详解:printf的实现 151
    8.7  可变参数问题 152
    第9章  编码规范 155
    9.1  排版 155
    9.2  注释 158
    9.3  标示符名称 163
    第10章  shell编程 165
    10.1  什么是shell 165
    10.2  几种流行的shell 165
    10.3  shell程序设计(基础部分) 166
    10.3.1  shell基本语法 166
    10.3.2  shell程序的变量和参数 167
    10.4  shell程序设计的流程控制 169
    10.4.1  test测试命令 169
    10.4.2  if条件语句 170
    10.4.3  for循环 171
    10.4.4  while和until循环 171
    10.4.5  case条件选择 172
    10.4.6  条件控制语句break和continue 173
    10.4.7  函数定义 173
    10.5  命令分组 174
    10.6  信号 174
    10.7  运行shell程序的方法 175
    10.8  bash程序的调试 175
    10.9  bash的内部命令 176
    第11章  文件操作 179
    11.1  Linux文件结构 179
    11.1.1  Linux文件系统 179
    11.1.2  Linux目录结构 180
    11.1.3  Linux文件分类 182
    11.1.4  常见文件类型 183
    11.1.5  Linux文件属性 183
    11.2  系统调用 184
    11.3  Linux文件描述符 184
    11.4  不带缓存的I/O操作 185
    11.4.1  creat函数 185
    11.4.2  open函数 186
    11.4.3  read函数 188
    11.4.4  write函数 189
    11.4.5  lseek函数 189
    11.4.6  close函数 189
    11.4.7  经典范例:文件复制 190
    11.5  带缓存的I/O操作 191
    11.5.1  三种类型的缓冲 191
    11.5.2  fopen函数 193
    11.5.3  fclose函数 194
    11.5.4  fdopen函数 194
    11.5.5  fread函数 195
    11.5.6  fwrite函数 195
    11.5.7  fseek函数 196
    11.5.8  fgetc函数、getc函数和getchar函数 197
    11.5.9  fputc函数、putc函数和putchar函数 198
    11.6  fgets函数与gets函数比较分析 199
    11.7  输出与输入 201
    11.7.1  printf函数、fprintf函数和sprintf函数 201
    11.7.2  scanf函数、fcanf函数和sscanf函数 203
    第12章  进程控制编程 207
    12.1  为何需要多进程(或者多线程),为何需要并发 207
    12.1.1  进程 207
    12.1.2  进程分类 208
    12.1.3  进程的属性 208
    12.1.4  父进程和子进程 208
    12.2  Linux进程管理 209
    12.2.1  ps监视进程工具 209
    12.2.2  pgrep查询进程工具 211
    12.2.3  终止进程的工具kill、killall、pkill、xkill 211
    12.2.4  top监视系统任务的工具 213
    12.2.5  进程的优先级:nice和renice 214
    12.3  Linux进程的三态 215
    12.3.1  三种基本状态 215
    12.3.2  三种状态间的转换 215
    12.4  Linux进程结构 216
    12.5  Linux进程控制块PCB 216
    12.6  Linux进程调度 218
    12.6.1  调度的目标 218
    12.6.2  调度算法 218
    12.6.3  优先级反转 220
    12.7  进程创建 221
    12.7.1  获取进程 221
    12.7.2  启动进程:fork( ) 222
    12.7.3  启动进程:vfork( ) 224
    12.7.4  启动进程:exec族 225
    12.7.5  启动进程:system 228
    12.8  进程等待 229
    12.8.1  僵尸进程的产生 229
    12.8.2  如何避免僵尸进程 231
    12.8.3  wait函数和waitpid函数 231
    12.9  进程退出 235
    12.9.1  退出方式的不同点 236
    12.9.2  exit( )和_exit( )函数 236
    12.9.3  exit( )和_exit( )的区别 237
    第13章  进程间通信方式 239
    13.1  进程间通信方式概述 239
    13.1.1  进程间通信的目的 239
    13.1.2  Linux进程间通信方式简介 240
    13.2  管道通信 241
    13.2.1  建立名管道 241
    13.2.2  读写名管道 242
    13.2.3  名管道应用实例 246
    13.2.4  创建有名管道 248
    13.2.5  读写有名管道 250
    13.3  管道通信方式的应用场景 253
    13.4  信号 254
    13.4.1  信号及信号来源 254
    13.4.2  信号种类 254
    13.4.3  信号处理方式 256
    13.4.4  信号发送 256
    13.4.5  自定义处理信号方式 258
    13.4.6  信号集操作 262
    13.4.7  使用信号注意事项 264
    13.5  消息队列 265
    13.5.1  消息队列基础理论 266
    13.5.2  使用消息队列 266
    13.5.3  消息队列API 267
    13.5.4  消息队列的限制 269
    13.5.5  消息队列的应用实例 270
    13.6  信号灯 273
    13.6.1  信号灯概述 273
    13.6.2  内核实现原理 274
    13.6.3  使用信号灯 274
    13.6.4  信号灯API 275
    13.6.5  信号灯的限制 277
    13.6.6  竞争问题 277
    13.6.7  信号灯应用实例 277
    13.7  共享内存方式一 281
    13.7.1  内核实现原理 281
    13.7.2  mmap( )及其相关系统调用 282
    13.7.3  mmap( )范例 283
    13.7.4  对mmap( )返回地址的访问 287
    13.8  共享内存方式二 289
    13.8.1  系统V共享内存原理 289
    13.8.2  系统V共享内存API 290
    13.8.3  系统V共享内存范例 291
    第14章  多线程编程 295
    14.1  线程概述 295
    14.1.1  为什么有了进程的概念后,还要再引入线程呢 295
    14.1.2  多线程的优点 296
    14.1.3  多线程的缺点 296
    14.2  多线程的实现 297
    14.2.1  线程的创建 297
    14.2.2  终止线程 299
    14.2.3  等待线程终止 300
    14.3  线程属性 300
    14.3.1  线程属性初始化 301
    14.3.2  线程分离 301
    14.3.3  线程的继承性 302
    14.3.4  线程的调度策略 303
    14.3.5  线程的调度参数 304
    14.3.6  实例分析 305
    14.4  线程同步机制 306
    14.4.1  互斥锁Mutex 306
    14.4.2  互斥锁使用实例 308
    14.4.3  条件变量Conditions 310
    14.4.4  条件变量使用实例 311
    第15章  网络编程 313
    15.1  TCP/IP协议概述 313
    15.1.1  TCP/IP 起源 313
    15.1.2  TCP/IP的特性与应用 315
    15.1.3  互联网地址 315
    15.1.4  域名系统 316
    15.1.5  封装 317
    15.1.6  TCP/IP工作模型 318
    15.1.7  TCP/IP 协议层 318
    15.1.8  TCP/IP应用 320
    15.1.9  网桥、路由器和网关 321
    15.2  TCP和UDP 322
    15.2.1  TCP协议 322
    15.2.2  三次握手协议 322
    15.2.3  TCP数据报头 323
    15.2.4  UDP协议 324
    15.2.5  协议的选择 324
    15.2.6  IP和端口号 324
    15.3  套接字 325
    15.3.1  Socket概念 325
    15.3.2  Socket类型 325
    15.3.3  Socket信息数据结构 325
    15.3.4  数据存储优先顺序的转换 326
    15.3.5  地址格式转化 327
    15.3.6  名字地址转化 328
    15.4  网络编程 330
    15.4.1  建立Socket 331
    15.4.2  绑定地址 332
    15.4.3  监听 333
    15.4.4  接受请求 334
    15.4.5  连接服务器 335
    15.4.6  发送数据 335
    15.4.7  接收数据 336
    15.5  采用TCP协议的C/S架构实现 338
    15.5.1  模块封装 338
    15.5.2  服务器的实现 340
    15.5.3  客户端的实现 341
    15.6  并发服务器模型 342
    15.6.1  多进程解决方案 342
    15.6.2  多线程解决方案 342
    15.6.3  调用fcntl将sockfd设置为非阻塞模式 348
    15.7  多路转接模型 348
    15.7.1  服务器的实现 349
    15.7.2  客户端的实现 354
    15.8  采用UDP协议C/S架构的实现 355
    15.8.1  服务器的实现 355
    15.8.2  客户端的实现 356
    15.8.3  UDP协议传输文件的实现 357
    参考文献 360
  • 内容简介:
    本书从嵌入式开发角度出发,以Linux操作系统为开发平台,将隐藏在系统开发背后的关于C语言、计算机组成原理、计算机操作系统等方面的机制和知识娓娓道来,不仅能让读者知其然,更要让读者知其所以然,揭开嵌入式Linux C系统开发背后鲜为人知的秘密,并让这些知识再反作用于编程实践,从而帮助读者写出高质量的嵌入式Linux C代码。具体说来,本书主要讨论了包括嵌入式C语言高级编程、嵌入式Linux系统编程、多任务解决机制、网络编程等多个方面的话内容。
  • 作者简介:
    魏清,男,工学硕士,毕业于南京邮电大学通信与信息系统专业,2011至今在苏嵌从事嵌入式项目的研究和培训工作,具有丰富的Linux驱动开发的经验。
  • 目录:
    目    录
    第1章  嵌入式Linux C语言开发工具 1
    1.1  嵌入式Linux C语言开发概述 1
    1.2  嵌入式Linux C开发环境 1
    1.3  嵌入式文本编辑器 2
    1.3.1  基本模式 2
    1.3.2  基本操作 3
    1.3.3  实训操作 5
    1.4  嵌入式编译器 6
    1.4.1  初识GCC编译器 6
    1.4.2  gcc命令常用选项及工作流程 6
    1.4.3  库的使用 10
    1.5  嵌入式调试器 12
    1.6  工程管理器 15
    1.6.1  Makefile 16
    1.6.2  Makefile特性介绍 18
    1.7  Eclipse程序开发 26
    1.7.1  Eclipse环境安装 26
    1.7.2  Eclipse C程序开发 28
    第2章  数据类型 35
    2.1  变量与常量 35
    2.2  变量 35
    2.2.1  什么是变量 35
    2.2.2  变量名和变量值 36
    2.2.3  局部变量和全局变量 38
    2.3  常量 40
    2.4  基本内置类型 41
    2.4.1  数据类型大小 42
    2.4.2  陷阱之有符号与符号 42
    2.5  声明与定义 43
    2.5.1  定义 43
    2.5.2  声明 43
    2.6  乱世枭雄:static与extern 44
    2.6.1  政权旗帜static 44
    2.6.2  外来的和尚会念经extern 45
    2.7  铁布衫:const 47
    2.8  隐形刺客:auto 48
    2.9  闪电飞刀:register 49
    2.10  专一王子:volatile 50
    2.11  typedef详解 51
    2.11.1  typedef与结构的问题 51
    2.11.2  typedef与#define的问题 53
    2.11.3  typedef与#define的另一例 53
    2.11.4  typedef与复杂的变量声明 54
    2.12  枚举 55
    2.12.1  枚举类型的使用方法 55
    2.12.2  枚举与#define 宏的区别 56
    2.13  联合体 56
    2.13.1  联合体的定义 56
    2.13.2  从两道经典试题谈联合体(union)的使用 57
    第3章  运算符、表达式 59
    3.1  运算符简介 59
    3.1.1  运算符优先级 59
    3.1.2  一些容易出错的优先级问题 61
    3.1.3  逻辑运算符 61
    3.2  条件运算符和条件表达式 62
    3.3  ++、操作符 63
    3.4  位运算 64
    3.4.1  按位与运算及应用 64
    3.4.2  按位或运算及应用 64
    3.4.3  按位异或运算及应用 65
    3.4.4  左移和右移 65
    3.5  C语言性能优化:使用位操作 65
    第4章  语句 67
    4.1  空语句 67
    4.2  基础语句 68
    4.2.1  表达式语句 68
    4.2.2  函数调用语句 68
    4.3  语句if 68
    4.3.1  布尔变量与零值比较 69
    4.3.2  整型变量与零值比较 69
    4.3.3  浮点变量与零值比较 69
    4.3.4  指针变量与零值比较 70
    4.3.5  对if语句的补充说明 70
    4.4  跳转语句:goto 70
    4.5  循环语句 71
    4.5.1  do-while语句 72
    4.5.2  for语句 72
    4.5.3  循环语句的效率 74
    4.6  break和continue 75
    4.6.1  break语句 75
    4.6.2  continue语句 75
    4.7  switch语句 77
    第5章  数组与指针 79
    5.1  数组认知 79
    5.2  使用数组之常见问题 80
    5.2.1  数组的下标总是从0开始吗 80
    5.2.2  可以使用数组后面第一个元素的地址吗 81
    5.2.3  为什么要小心对待位于数组后面的那些元素的地址呢 82
    5.2.4  数组作为参数传递给函数时,可以通过sizeof得到数组的大小吗 82
    5.2.5  指针或带下标的数组名都可以访问元素,哪一种更好呢 83
    5.2.6  可以把另外一个地址赋给一个数组名吗 85
    5.2.7  array_name和&array_name有什么不同 86
    5.2.8  为什么用const说明的常量不能用来定义一个数组的初始大小 87
    5.2.9  字符串和数组有什么不同 87
    5.3  指针 89
    5.3.1  指针是变量 90
    5.3.2  指针的类型和指针所指向的类型 90
    5.3.3  指针的值 91
    5.3.4  指针本身所占据的内存区 91
    5.4  指针的运算 92
    5.4.1  指针的算术运算 92
    5.4.2  指针的关系运算 92
    5.4.3  间接引用 93
    5.4.4  最多可以使用几层指针 93
    5.5  常量指针和指针常量 95
    5.5.1  常量指针与指针常量的实例 95
    5.5.2  常量指针的应用 96
    5.6  空指针及其使用 97
    5.6.1  NULL总是被定义为0吗 97
    5.6.2  NULL总是等于0吗 97
    5.6.3  空指针的使用 98
    5.7  指针void:万能指针 99
    5.8  指针数组与数组指针 100
    5.9  字符串函数详解 101
    5.10  函数指针与指针函数 105
    5.11  复杂指针声明:“int * (* (*fp1) (int) ) [10];” 106
    5.11.1  基础 106
    5.11.2  const修饰符 107
    5.11.3  typedef的妙用 108
    5.11.4  函数指针 109
    5.11.5  右左法则 109
    第6章  内存管理 111
    6.1  你的数据放在哪里 111
    6.1.1  未初始化的全局变量(.bss段) 111
    6.1.2  初始化过的全局变量(.data段) 112
    6.1.3  常量数据(.rodata段) 112
    6.1.4  代码(.text段) 113
    6.1.5  栈(stack) 113
    6.1.6  堆(heap) 113
    6.2  内存分配方式 114
    6.3  野指针 115
    6.4  常见的内存错误及对策 115
    6.5  段错误以及调试方法 116
    6.5.1  方法一:利用gdb逐步查找段错误 117
    6.5.2  方法二:分析core文件 118
    6.5.3  方法三:段错误时启动调试 119
    6.5.4  方法四:利用backtrace和objdump进行分析 120
    6.6  指针与数组的对比 121
    第7章  预处理、结构体 125
    7.1  宏定义:#define 125
    7.1.1  参宏定义 125
    7.1.2  带参宏定义 127
    7.2  文件包含 128
    7.3  条件编译 129
    7.4  宏定义使用技巧 131
    7.5  关于#和## 132
    7.6  结构体 133
    7.6.1  内存字节对齐 135
    7.6.2  内存对齐正式原则 138
    7.7  #define和typedef的区别 139
    7.8  结构体和联合体的区别 139
    7.9  浅谈C语言中的位段 139
    7.9.1  位段的使用 140
    7.9.2  位段结构在内存中的存储方式 140
    第8章  函数 141
    8.1  函数声明与定义 141
    8.1.1  定义 141
    8.1.2  声明与定义不同 142
    8.2  形式参数和实际参数 143
    8.3  参数传递 143
    8.3.1  简单变量或数组元素作为函数参数 143
    8.3.2  指针变量或数组名作为函数参数 144
    8.3.3  数组名作函数参数 145
    8.3.4  结构体数组作函数参数 146
    8.4  如何编写有多个返回值的C语言函数 146
    8.4.1  利用全局变量 146
    8.4.2  传递数组指针 148
    8.4.3  传递结构体指针 148
    8.5  回调函数 149
    8.6  变参函数详解:printf的实现 151
    8.7  可变参数问题 152
    第9章  编码规范 155
    9.1  排版 155
    9.2  注释 158
    9.3  标示符名称 163
    第10章  shell编程 165
    10.1  什么是shell 165
    10.2  几种流行的shell 165
    10.3  shell程序设计(基础部分) 166
    10.3.1  shell基本语法 166
    10.3.2  shell程序的变量和参数 167
    10.4  shell程序设计的流程控制 169
    10.4.1  test测试命令 169
    10.4.2  if条件语句 170
    10.4.3  for循环 171
    10.4.4  while和until循环 171
    10.4.5  case条件选择 172
    10.4.6  条件控制语句break和continue 173
    10.4.7  函数定义 173
    10.5  命令分组 174
    10.6  信号 174
    10.7  运行shell程序的方法 175
    10.8  bash程序的调试 175
    10.9  bash的内部命令 176
    第11章  文件操作 179
    11.1  Linux文件结构 179
    11.1.1  Linux文件系统 179
    11.1.2  Linux目录结构 180
    11.1.3  Linux文件分类 182
    11.1.4  常见文件类型 183
    11.1.5  Linux文件属性 183
    11.2  系统调用 184
    11.3  Linux文件描述符 184
    11.4  不带缓存的I/O操作 185
    11.4.1  creat函数 185
    11.4.2  open函数 186
    11.4.3  read函数 188
    11.4.4  write函数 189
    11.4.5  lseek函数 189
    11.4.6  close函数 189
    11.4.7  经典范例:文件复制 190
    11.5  带缓存的I/O操作 191
    11.5.1  三种类型的缓冲 191
    11.5.2  fopen函数 193
    11.5.3  fclose函数 194
    11.5.4  fdopen函数 194
    11.5.5  fread函数 195
    11.5.6  fwrite函数 195
    11.5.7  fseek函数 196
    11.5.8  fgetc函数、getc函数和getchar函数 197
    11.5.9  fputc函数、putc函数和putchar函数 198
    11.6  fgets函数与gets函数比较分析 199
    11.7  输出与输入 201
    11.7.1  printf函数、fprintf函数和sprintf函数 201
    11.7.2  scanf函数、fcanf函数和sscanf函数 203
    第12章  进程控制编程 207
    12.1  为何需要多进程(或者多线程),为何需要并发 207
    12.1.1  进程 207
    12.1.2  进程分类 208
    12.1.3  进程的属性 208
    12.1.4  父进程和子进程 208
    12.2  Linux进程管理 209
    12.2.1  ps监视进程工具 209
    12.2.2  pgrep查询进程工具 211
    12.2.3  终止进程的工具kill、killall、pkill、xkill 211
    12.2.4  top监视系统任务的工具 213
    12.2.5  进程的优先级:nice和renice 214
    12.3  Linux进程的三态 215
    12.3.1  三种基本状态 215
    12.3.2  三种状态间的转换 215
    12.4  Linux进程结构 216
    12.5  Linux进程控制块PCB 216
    12.6  Linux进程调度 218
    12.6.1  调度的目标 218
    12.6.2  调度算法 218
    12.6.3  优先级反转 220
    12.7  进程创建 221
    12.7.1  获取进程 221
    12.7.2  启动进程:fork( ) 222
    12.7.3  启动进程:vfork( ) 224
    12.7.4  启动进程:exec族 225
    12.7.5  启动进程:system 228
    12.8  进程等待 229
    12.8.1  僵尸进程的产生 229
    12.8.2  如何避免僵尸进程 231
    12.8.3  wait函数和waitpid函数 231
    12.9  进程退出 235
    12.9.1  退出方式的不同点 236
    12.9.2  exit( )和_exit( )函数 236
    12.9.3  exit( )和_exit( )的区别 237
    第13章  进程间通信方式 239
    13.1  进程间通信方式概述 239
    13.1.1  进程间通信的目的 239
    13.1.2  Linux进程间通信方式简介 240
    13.2  管道通信 241
    13.2.1  建立名管道 241
    13.2.2  读写名管道 242
    13.2.3  名管道应用实例 246
    13.2.4  创建有名管道 248
    13.2.5  读写有名管道 250
    13.3  管道通信方式的应用场景 253
    13.4  信号 254
    13.4.1  信号及信号来源 254
    13.4.2  信号种类 254
    13.4.3  信号处理方式 256
    13.4.4  信号发送 256
    13.4.5  自定义处理信号方式 258
    13.4.6  信号集操作 262
    13.4.7  使用信号注意事项 264
    13.5  消息队列 265
    13.5.1  消息队列基础理论 266
    13.5.2  使用消息队列 266
    13.5.3  消息队列API 267
    13.5.4  消息队列的限制 269
    13.5.5  消息队列的应用实例 270
    13.6  信号灯 273
    13.6.1  信号灯概述 273
    13.6.2  内核实现原理 274
    13.6.3  使用信号灯 274
    13.6.4  信号灯API 275
    13.6.5  信号灯的限制 277
    13.6.6  竞争问题 277
    13.6.7  信号灯应用实例 277
    13.7  共享内存方式一 281
    13.7.1  内核实现原理 281
    13.7.2  mmap( )及其相关系统调用 282
    13.7.3  mmap( )范例 283
    13.7.4  对mmap( )返回地址的访问 287
    13.8  共享内存方式二 289
    13.8.1  系统V共享内存原理 289
    13.8.2  系统V共享内存API 290
    13.8.3  系统V共享内存范例 291
    第14章  多线程编程 295
    14.1  线程概述 295
    14.1.1  为什么有了进程的概念后,还要再引入线程呢 295
    14.1.2  多线程的优点 296
    14.1.3  多线程的缺点 296
    14.2  多线程的实现 297
    14.2.1  线程的创建 297
    14.2.2  终止线程 299
    14.2.3  等待线程终止 300
    14.3  线程属性 300
    14.3.1  线程属性初始化 301
    14.3.2  线程分离 301
    14.3.3  线程的继承性 302
    14.3.4  线程的调度策略 303
    14.3.5  线程的调度参数 304
    14.3.6  实例分析 305
    14.4  线程同步机制 306
    14.4.1  互斥锁Mutex 306
    14.4.2  互斥锁使用实例 308
    14.4.3  条件变量Conditions 310
    14.4.4  条件变量使用实例 311
    第15章  网络编程 313
    15.1  TCP/IP协议概述 313
    15.1.1  TCP/IP 起源 313
    15.1.2  TCP/IP的特性与应用 315
    15.1.3  互联网地址 315
    15.1.4  域名系统 316
    15.1.5  封装 317
    15.1.6  TCP/IP工作模型 318
    15.1.7  TCP/IP 协议层 318
    15.1.8  TCP/IP应用 320
    15.1.9  网桥、路由器和网关 321
    15.2  TCP和UDP 322
    15.2.1  TCP协议 322
    15.2.2  三次握手协议 322
    15.2.3  TCP数据报头 323
    15.2.4  UDP协议 324
    15.2.5  协议的选择 324
    15.2.6  IP和端口号 324
    15.3  套接字 325
    15.3.1  Socket概念 325
    15.3.2  Socket类型 325
    15.3.3  Socket信息数据结构 325
    15.3.4  数据存储优先顺序的转换 326
    15.3.5  地址格式转化 327
    15.3.6  名字地址转化 328
    15.4  网络编程 330
    15.4.1  建立Socket 331
    15.4.2  绑定地址 332
    15.4.3  监听 333
    15.4.4  接受请求 334
    15.4.5  连接服务器 335
    15.4.6  发送数据 335
    15.4.7  接收数据 336
    15.5  采用TCP协议的C/S架构实现 338
    15.5.1  模块封装 338
    15.5.2  服务器的实现 340
    15.5.3  客户端的实现 341
    15.6  并发服务器模型 342
    15.6.1  多进程解决方案 342
    15.6.2  多线程解决方案 342
    15.6.3  调用fcntl将sockfd设置为非阻塞模式 348
    15.7  多路转接模型 348
    15.7.1  服务器的实现 349
    15.7.2  客户端的实现 354
    15.8  采用UDP协议C/S架构的实现 355
    15.8.1  服务器的实现 355
    15.8.2  客户端的实现 356
    15.8.3  UDP协议传输文件的实现 357
    参考文献 360
查看详情
系列丛书 / 更多
相关图书 / 更多
高质量嵌入式Linux C编程
高质量软件构建方法与实践
王杰 著;董昕;梁艳
高质量嵌入式Linux C编程
高质量发展视域下中国能源效率问题研究
欧阳晓灵 著
高质量嵌入式Linux C编程
高质量需求(英文限量版)
坎黛西·霍坎森(Candase Hokanson) 著;[美]卡尔·魏格斯(Karl Wiegers)
高质量嵌入式Linux C编程
高质量发展:读懂新时代中国经济
金碚 陈晓东
高质量嵌入式Linux C编程
高质量推进乡村振兴:理论研究与江西实践
郑瑞强,张宜红,陈洋庚
高质量嵌入式Linux C编程
高质量发展如何看怎样干:人民日报记者调研行
人民日报社 编
高质量嵌入式Linux C编程
高质量教育发展背景下的教师教育者专业成长研究
郑爽
高质量嵌入式Linux C编程
高质量陪伴:每天10分钟,陪孩子玩出好体力
陈晓群
高质量嵌入式Linux C编程
高质量发展背景下绿色金融发展研究
赵朝霞;陈红英;熊萍
高质量嵌入式Linux C编程
高质量发展背景下的中国特色桥梁创作:雄安新区桥梁设计征集作品集
河北雄安新区规划研究中心 著;葛亮、张为 编
高质量嵌入式Linux C编程
高质量发展的湖北实践与探索
赵霞 著
高质量嵌入式Linux C编程
高质量发展如何铸就——新时代企业党建典型案例
岳奎