第1章 Linux操作系统概述 1
1.1 认识Linux操作系统 2
1.1.1 Linux操作系统发展背景 2
1.1.2 Linux操作系统的特点 2
1.1.3 Linux操作系统的应用现状 3
1.2 Linux C开发概述 3
1.2.1 Linux C开发简介 3
1.2.2 IEEE POSIX 4
1.2.3 Linux C开发工具 4
1.3 小结 4
习题 4
第2章 Linux的基本操作 7
2.1 shell初体验 8
2.1.1 虚拟终端 8
2.1.2 shell命令 8
2.2 shell常用命令 9
2.2.1 目录和文件操作命令 9
2.2.2 文件归档及压缩 15
2.2.3 软件包的安装 17
2.3 深入shell 18
2.3.1 通配符 18
2.3.2 重定向 18
2.3.3 管道 19
2.3.4 自动补全 19
2.3.5 用户操作命令 20
2.3.6 关机与重启 21
2.4 硬链接与软链接 22
2.4.1 硬链接 23
2.4.2 软链接 24
2.5 小结 24
习题 25
第3章 文本编辑器 27
3.1 vi编辑器概述 28
3.1.1 vi的三种工作模式 28
3.1.2 vi的初体验 28
3.2 命令模式下的文本块操作 29
3.2.1 行的定位 29
3.2.2 文本块的复制、移动和删除 30
3.2.3 撤销和重复 31
3.2.4 字符串的查找 31
3.3 末行模式下的常用操作 31
3.4 vi环境定制 32
3.5 小结 33
习题 33
第4章 Linux下的C语言开发基础 35
4.1 C语言开发的基本步骤 36
4.1.1 gcc编译工具 36
4.1.2 gcc编译过程详解 37
4.1.3 gcc编译多文件 39
4.2 头文件 40
4.2.1 头文件的编辑和使用 40
4.2.2 进一步理解头文件 42
4.2.3 头文件重复包含 43
4.3 gdb调试工具 44
4.3.1 gdb调试基本命令 44
4.3.2 gdb初体验 46
4.3.3 gdb的断点调试 48
4.4 IDE工具CodeBlocks 51
4.4.1 CodeBlocks的安装 51
4.4.2 CodeBlocks的使用 52
4.5 小结 55
习题 55
第5章 静态库和动态库 57
5.1 库的概述 58
5.1.1 为什么使用库 58
5.1.2 库的特点 58
5.2 静态库 59
5.2.1 静态库的创建 59
5.2.2 静态库的使用 60
5.3 动态库 61
5.3.1 动态库的创建 61
5.3.2 动态库的使用 62
5.4 静态库和动态库的区别 62
5.4.1 实例测试 63
5.4.2 验证环节 63
5.5 综合举例 65
5.6 小结 66
习题 66
第6章 make工程管理 69
6.1 make概述 70
6.1.1 make命令和Makefile文件 70
6.1.2 Makefile文件编写 70
6.1.3 Makefile文件中的变量 72
6.1.4 Makefile通配符 73
6.1.5 Makefile文件的默认规则 74
6.1.6 Makefile文件中的伪目标 75
6.1.7 make的条件执行 76
6.2 automake的使用 76
6.2.1 automake生成Makefile步骤 76
6.2.2 实例讲解 77
6.3 小结 80
习题 80
第7章 Linux下的文件编程 81
7.1 概述 82
7.1.1 Linux下的系统调用 82
7.1.2 基本I/O函数 82
7.1.3 文件描述符 83
7.2 基本I/O操作 83
7.2.1 open函数 84
7.2.2 close函数 86
7.2.3 write函数 87
7.2.4 read函数 88
7.2.5 lseek函数 90
7.3 文件锁 91
7.3.1 Linux下的文件锁机制 93
7.3.2 文件锁的使用 93
7.3.3 实例讲解 94
7.4 目录操作 97
7.4.1 mkdir函数 97
7.4.2 rmdir函数 98
7.4.3 getcwd函数 99
7.4.4 opendir函数 99
7.4.5 readdir函数 100
7.4.6 closedir函数 101
7.5 项目实战 101
7.6 小结 110
习题 110
第8章 shell脚本的开发 113
8.1 shell编程基础 114
8.2 管道和重定向 114
8.2.1 输出重定向 114
8.2.2 输入重定向 115
8.2.3 管道 115
8.3 shell脚本的语法 116
8.3.1 变量 117
8.3.2 程序结构 118
8.3.3 函数 123
8.3.4 命令及其执行 123
8.3.5 调试脚本 125
8.4 shell脚本设计示例 125
8.4.1 查看主机网卡流量 125
8.4.2 监控CPU和内存的使用情况 126
8.4.3 查找日期为某一天 126
8.5 小结 127
习题 127
第9章 进程管理 129
9.1 进程概述 130
9.1.1 进程的概念 130
9.1.2 进程ID 130
9.1.3 进程调度 131
9.2 进程控制 132
9.2.1 进程控制块 132
9.2.2 进程创建函数(fork) 133
9.2.3 进程等待函数(wait) 138
9.2.4 waitpid函数 139
9.2.5 vfork函数 142
9.2.6 进程终止函数(exit) 143
9.2.7 exec函数 145
9.3 小结 146
习题 146
第10章 进程间通信(IPC) 149
10.1 进程通信概述 150
10.1.1 管道 150
10.1.2 信号 153
10.1.3 信号的产生方式 154
10.1.4 信号的处理方式 154
10.2 信号量 156
10.2.1 信号量定义 157
10.2.2 信号量功能 157
10.2.3 使用信号量 164
10.3 共享内存 167
10.3.1 认识共享内存 167
10.3.2 共享内存函数 168
10.4 消息队列 173
10.4.1 消息队列概述 174
10.4.2 消息队列函数 176
10.4.3 消息队列编程实例 179
10.4.4 ATM的实现 183
10.5 小结 189
习题 189
第11章 POSIX线程 191
11.1 认识线程 192
11.2 多线程编程 194
11.2.1 线程创建函数 195
11.2.2 多线程中的线程等待 198
11.2.3 线程专有数据 199
11.2.4 保证多线程编程中函数的可重入性 202
11.3 线程的属性 203
11.3.1 常用线程属性 203
11.3.2 常用线程属性函数 205
11.4 线程的销毁 206
11.5 线程的同步 209
11.5.1 用信号量进行同步 209
11.5.2 用互斥量进行同步 211
11.6 聊天室的实现 214
11.7 小结 219
习题 219
第12章 Linux网络编程 221
12.1 网络编程常识 222
12.1.1 TCP/IP协议概述 222
12.1.2 IP地址与端口 223
12.1.3 网络字节序和主机字节序 224
12.2 简单的本地通信 225
12.2.1 socket实现本地通信 226
12.2.2 相关API详解 226
12.3 socket实现网络通信 230
12.3.1 基于TCP的网络编程 230
12.3.2 相关API详解 230
12.3.3 基于UDP的网络编程 234
12.4 守护进程 237
12.4.1 守护进程概念 237
12.4.2 守护进程的编写要点 238
12.5 多客户通信 242
12.6 小结 245
习题 246
第13章 Linux驱动程序和嵌入式基础 249
13.1 Linux驱动程序与嵌入式开发的基础知识 250
13.1.1 嵌入式Linux的特点 250
13.1.2 嵌入式Linux的系统开发平台 251
13.1.3 嵌入式Linux开发的一般流程 251
13.1.4 嵌入式Linux驱动程序 252
13.2 Linux驱动程序与嵌入式开发中的注意问题 253
13.2.1 Linux的内存空间划分 253
13.2.2 Linux的内存管理和IO寻址 253
13.2.3 Linux的时基问题 254
13.3 Linux驱动程序和嵌入式开发的设备类型 254
13.3.1 字符设备特点 255
13.3.2 块设备特点 255
13.4 Linux嵌入式开发的应用特点 255
13.4.1 常用的调试方法 255
13.4.2 可移植性问题 256
13.5 小结 256
习题 257
附录 习题答案 259