标题：Linux C编程从初学到精通
图书信息
华清远见嵌入式培训中心  张繁  等编著  ISBN 978-7-121-12804-2
2011年4月出版
定价：69.00元（含DVD光盘1张）
16开
548页
宣传语
深入浅出，依靠深厚行业经验讲透技术原理
循序渐进，详解典型应用案例提升实战能力
内 容 简 介
本书深入浅出、循序渐进地讲解了Linux平台下的C程序设计，并通过大量的程序实例，以及综合开发案例的演示，帮助读者快速掌握Linux下C语言编程的方法和技巧。
本书内容翔实，共分为三大部分。第一部分为基础篇，共有5章，主要讲解了Linux系统的概述、C语言编程基础、Linux下的两种常用文本编辑器vi和Emacs、程序编译器gcc和调试器gdb，以及make管理工具。第二部分为提高篇，共有7章，主要讲解了Linux系统下各种操作的系统调用，包括文件操作、进程控制、进程间通信、网络编程、GTK+图形界面编程等。第三部分为实践篇，共有5章，分别为5个不同的Linux平台下C程序开发的综合案例，向读者详细阐述了Linux文件操作、GTK+图形界面编程、Linux网络编程，以及基于Linux平台的嵌入式软件开发的方法和技巧。
本书是由作者根据多年来的开发工作经验编著而成，语言通俗易懂，内容丰富，注重实例讲解，知识涵盖面广。非常适合Linux平台下C语言编程的初学者以及高校本科生、研究生阅读，也适合在Linux系统下进行C程序开发的工程师查阅和学习。
前  言
Linux诞生于1991年，由UNIX发展而来。几乎每天Linux都会以某种方式出现在我们的生活中，我们已经数不清在Linux上有多少应用程序，以及有多少机构在使用Linux。国内外无数大型企业都在使用Linux系统作为服务器解决方案，尤其是在嵌入式开发领域，Linux的应用更是在不断增加。在百度上搜索“Linux 软件工程师”的相关网页约有1,230,000篇，由此可见，在Linux平台下进行程序开发的需求之大。
作者根据自己多年来在Linux下进行C程序开发所积累的经验，并融合大量的程序实例而著成此书。本书由浅入深，适合各个水平阶段的读者学习。
本书特点
1．配套视频讲解光盘
为了让读者更加快速、直观地学习本书内容，作者专门为本书录制了全程多媒体视频教学，包括各个技术知识点，以及程序案例的分析。结合视频的讲解，能够帮助读者更高效地掌握Linux下C编程的技巧与方法。
2．循序渐进，由浅入深
从Linux系统的安装、C语言编程基础、Linux下的基本编辑器、程序编译器和调试器、make工具管理器，到Linux系统的各种函数调用，再到Linux下具体程序案例的设计开发，本书内容由浅入深，囊括了Linux下C程序开发的各个环节。
3．程序实例丰富，实践性强
在本书中，几乎每个知识点都会伴随一个或多个程序实例，通过实例来加深和巩固读者对知识点的理解和掌握。对于每个程序实例，作者都添加了十分详细的注释，方便读者理解。并且，所有的实例读者都可以在自己的实验环境中完整实现。尤其是第3部分的五个项目案例，更是完整地向读者演示了Linux环境下项目实例的设计与开发。
4．技术全面，知识点阐述到位
网络编程和图形界面编程是C程序学习中比较深入的知识，也是本书重点讲解的内容。在第3部分，我们将这些知识点与实际的项目开发结合，通过逐步设计与实现，深化和巩固读者对它们的理解与掌握。将Linux系统开发技术、C语言开发技术、软件工程思想融会贯通，使得本书成为思想和内容都极其丰富的计算机教程。
本书内容
第1章：介绍Linux系统的基本概念和安装方法，Linux下的常用命令，以及Shell的使用。这些是使用Linux的基础，帮助读者为本书后续的学习打下扎实的基础。
第2章：详细讲述了C语言的编程基础，它们是熟悉和掌握这些信息与学习C语言的必经之路，同时也方便了读者在阅读本书时查阅C语言中的相关知识点。
第3章：讲述Linux下最常用的两种文本编辑器vi和Emacs，通过实例应用讲解让读者一步一步地学会如何使用这些编辑器的使用。
第4章：讲解Linux系统下的程序编译器gcc和程序调试器gdb，二者是在Linux下进行C程序开发所必备的工具。
第5章：讲述Linux下的工程管理器make，以及Makefile的书写规则。make工具大大提高了实际项目的工作效率，几乎所有Linux下的项目编程都会涉及它。
第6章：讲解基于文件描述符的文件I/O操作，以及Linux中文件系统的概念。文件操作是Linux系统中最常见的操作之一，在Linux中，所有的内容都被看成文件，所有的操作都可以归结为对文件的操作。
第7章：讲述基于流的文件I/O操作。基于流的I/O操作是由标准C函数库提供的，与基于文件描述符的I/O操作相比，基于流的I/O更简单、方便。在大多数情况下，程序员更愿意使用基于流的输入输出方法。
第8章：详细阐述了Linux下进程控制的原理。进程是操作系统中一个非常重要的概念，熟悉使用进程的操作和进程控制的相关系统调用，会使用户在使用Linux系统完成各种工作时更加得心应手。
第9章：讲解Linux信号的基本概念，以及Linux下信号处理的机制。信号的使用对于灵活使用C语言在Linux环境下进行程序开发是非常有益的，在编写大型的程序时，经常会需要处理多个进程之间的异步事件，所以是离不开信号的使用的。
第10章：详细讲述了Linux进程间通信的概念，以及Linux下5中最常用的进程间通信方式，它们包括：管道、命名管道、消息队列、共享内存、信号量等。
第11章：详细讲述了Linux网络编程的原理与方法，通过大量的程序实例演示了Socket编程中常用API的使用方法。
第12章：讲述GTK+图形界面编程。GTK+是Linux下基于C的图形界面开发库，通过程序实例向读者演示了使用GTK+库创建各种界面元件的方法。
第13章：通过讲述一个计算器软件的设计案例，进一步向读者演示图形界面编程的技巧，以及GTK+信号与回调函数的原理。
第14章：通过设计一个类似于QQ的聊天软件，向读者演示了小型项目工程软件的模块划分方法，以及Linux下的C程序开发的步骤。使读者能够更深层次地掌握GTK+图形界面编程，以及Linux网络编程的原理方法。
第15章：讲述Linux下一种基于C/S模式实现的远程管理工具的设计。使读者对Linux下的文件I/O操作、相关系统服务的管理有更深层次的了解和认识，并进一步掌握GTK+图形界面编程，套接字Socket网络编程的使用方法。
第16章：讲述了在Linux-2.4.20-8内核下利用Netfilter数据控制过滤机制完成简易防火墙软件的设计，实现了对固定端口、网页访问，以及不同协议类型的数据报文的管理和控制。
第17章：讲述基于Linux的嵌入式家庭网关远程交互操作平台的设计。向读者阐述了嵌入式系统，以及家庭网关的概念，采用B/S结构的开发模式，嵌入式Web服务器选取Boa，并结合CGI技术，实现了动态的具体智能设备的访问和控制。
本书适合的读者：
 Linux及C程序设计初学者。
 大中专院校计算机及相关专业的学生。
 高校计算机及相关专业本科生、研究生。
 Linux软件开发从业人员。
 开源软件开发爱好者。
 社会培训学生。
最后，我要感谢我的家人及好友陈曦在我最困难的时候带给我快乐与动力，支持我一直坚持下来，并最终完成这部著作。
本书主要由张繁主持编写，参加本书编写工作的还有高淑娟、王丽娜、周毅、林小峰、刘刚、马海波、李强、吴慧、马玉刚、冯浩、唐爱琴、李子龙、王明明、蒋志等，在此，编者对以上人员致以诚挚的谢意！
作者力图使本书案例功能翔实，并尽量使用关键编程技术进行程序设计和简化程序代码。但由于水平有限，书中难免有错误、纰漏之处，欢迎广大读者、同仁批评斧正。
编著者
目  录
第1部分 基础篇
第1章  Linux系统概述 1
1.1  什么是Linux 2
1.2  Linux系统特点及主要功能 2
1.2.1  Linux系统特点 3
1.2.2  Linux系统的主要功能 3
1.3  Linux的内核版本和发行版本 5
1.4  系统的安装 6
1.4.1  系统安装前的准备工作 6
1.4.2  从光盘安装Linux 6
1.4.3  从硬盘安装Linux 22
1.4.4  在虚拟机下安装Linux 22
1.5  Shell的使用 27
1.5.1  Shell简介 27
1.5.2  常见Shell的种类 28
1.5.3  Shell的简单使用 29
1.5.4  通配符 30
1.5.5  引号 31
1.5.6  注释符 33
1.6  Linux常用命令 33
1.6.1  与目录相关的命令 33
1.6.2  与文件相关的命令 34
1.6.3  与网络服务相关的命令 35
1.7  本章小结 35
实战演练 36
第2章  C语言编程基础 37
2.1  C语言的历史背景 38
2.2  C语言的特点 38
2.3  C语言的基本数据类型 39
2.3.1  整型 39
2.3.2  实型 40
2.3.3  字符型 41
2.4  运算符与表达式 43
2.4.1  算术运算符与算术表达式 43
2.4.2  赋值运算符与赋值表达式 44
2.4.3  逗号运算符与逗号表达式 45
2.5  C程序的3种基本结构 46
2.5.1  顺序结构 46
2.5.2  选择结构 47
2.5.3  循环结构 51
2.6  C语言中的数据输入与输出 54
2.6.1  字符输出函数putchar 54
2.6.2  字符输入函数getchar 54
2.6.3  格式输出函数printf 54
2.6.4  格式输入函数scanf 56
2.7  函数 57
2.7.1  函数的定义 57
2.7.2  函数的调用 58
2.7.3  变量的存储类别 59
2.8  数组 62
2.8.1  一维数组的定义和使用 63
2.8.2  二维数组的定义和使用 64
2.8.3  字符数组和字符串 65
2.8.4  常用字符串处理函数 66
2.9  指针 69
2.9.1  地址和指针 69
2.9.2  指针的定义和使用 70
2.9.3  数组与指针 71
2.9.4  字符串与指针 72
2.9.5  指向函数的指针 72
2.10  结构体和共用体 73
2.10.1  定义和引用结构体 73
2.10.2  结构体数组 74
2.10.3  指向结构体的指针 74
2.10.4  共用体 75
2.10.5  使用typedef定义类型 77
2.11  链表 77
2.11.1  链表概述 77
2.11.2  建立动态单向链表 78
2.11.3  单向链表的输出 80
2.11.4  对单向链表的删除操作 80
2.11.5  对单向链表的插入操作 81
2.11.6  循环链表 82
2.11.7  双向链表 82
2.12 位运算符和位运算 83
2.12.1  “按位与”运算符（&） 84
2.12.2  “按位或”运算符（|） 84
2.12.3  “取反”运算符（~） 84
2.12.4  “异或”运算符（^） 84
2.12.5  移位运算符（<<和>>） 85
2.12.6  位域 85
2.13  C语言预处理命令 86
2.13.1  宏定义 86
2.13.2  文件包含 87
2.13.3  条件编译 88
2.13.4  #error等其他常用预处理命令 89
2.14  本章小结 89
实战演练 89
第3章  vi与Emacs编辑器 91
3.1  vi的使用 92
3.1.1  启动与退出vi 92
3.1.2  vi的命令行模式 93
3.1.3  vi的插入模式 96
3.1.4  vi的底行模式 96
3.2  vi使用实例 97
3.3  Emacs的使用 100
3.3.1  启动与退出Emacs 101
3.3.2  Emacs下的基本操作 102
3.4  Emacs使用实例 107
3.5  本章小结 109
实战演练 109
第4章  gcc编译器与gdb调试器 110
4.1  gcc编译器简介 111
4.2  如何使用gcc 112
4.2.1  gcc编译初步 112
4.2.2  警告提示功能 114
4.2.3  优化gcc 116
4.2.4  连接库 119
4.2.5  同时编译多个源程序 120
4.2.6  管道 120
4.2.7  调试选项 121
4.3  gdb调试器 122
4.3.1  gdb简介 122
4.3.2  gdb常用命令 123
4.3.3  gdb调试初步 124
4.4  gdb的使用详解 126
4.4.1  调用gdb 127
4.4.2  使用断点 127
4.4.3  查看运行时数据 129
4.4.4  查看源程序 133
4.4.5  改变程序的执行 135
4.5  xxgdb调试器简介 138
4.6  本章小结 139
实战演练 139
第5章 make的使用和Makefile的编写 141
5.1  什么是make 142
5.1.1  make机制概述 142
5.1.2  make与Makefile的关系 144
5.2  Makefile的书写规则 147
5.2.1  Makefile的基本语法规则 148
5.2.2  在规则中使用通配符 149
5.2.3  伪目标 149
5.2.4  多目标 151
5.2.5  自动生成依赖性 151
5.3  Makefile的命令 152
5.4  变量 154
5.4.1  变量的基础 154
5.4.2  赋值变量 154
5.4.3  define关键字 156
5.4.4  override指示符 156
5.4.5  目标变量和模式变量 157
5.5  常用函数调用 158
5.5.1  字符串处理函数 158
5.5.2  文件名操作函数 162
5.5.3  循环函数 164
5.5.4  条件判断函数 165
5.5.5  其他常用函数 166
5.6  隐式规则 168
5.6.1  隐式规则举例 168
5.6.2  隐式规则中的变量 169
5.6.3  使用模式规则 170
5.7  本章小结 173
实战演练 173
第2部分  提高篇
第6章  文件I/O操作 174
6.1  Linux文件系统简介 175
6.1.1  Linux的文件系统结构 175
6.1.2  文件类型 176
6.1.3  文件访问权限 179
6.2  基于文件描述符的I/O操作 179
6.2.1  文件描述符 180
6.2.2  标准输入、标准输出和标准出错 180
6.2.3  文件重定向 181
6.2.4  文件的创建、打开与关闭 182
6.2.5  文件的定位 186
6.2.6  文件的读写 188
6.3  文件的属性操作 192
6.3.1  改变文件访问权限 192
6.3.2  改变文件所有者 193
6.3.3  重命名 193
6.3.4  修改文件长度 194
6.4  文件的其他操作 195
6.4.1  stat、fstat和lstat函数 195
6.4.2  dup和dup2函数 196
6.4.3  fcntl函数 197
6.4.4  sync和fsync函数 197
6.5  特殊文件的操作 198
6.5.1  目录文件的操作 198
6.5.2  链接文件的操作 201
6.5.3  管道文件的操作 204
6.5.4  设备文件 204
6.6  本章小结 205
实战演练 205
第7章 基于流的I/O操作 206
7.1  流与缓存 207
7.1.1  流和FILE对象 207
7.1.2  标准输入、标准输出和标准出错 207
7.1.3  缓存 207
7.1.4  对缓存的操作 210
7.2  流的打开与关闭 212
7.2.1  流的打开 212
7.2.2  流的关闭 214
7.2.3  流关闭前的工作 216
7.3  流的读写 216
7.3.1  基于字符的I/O 217
7.3.2  基于行的I/O 220
7.3.3  直接I/O 222
7.3.4  格式化I/O 224
7.4  本章小结 226
实战演练 227
第8章 进程控制 228
8.1  进程的基本概念 229
8.1.1  Linux进程简介 229
8.1.2  进程与作业 230
8.1.3  进程标识 230
8.2  进程控制的相关函数 232
8.2.1  fork和vfork函数 232
8.2.2  exec函数 237
8.2.3  exit和_exit函数 242
8.2.4  wait和waitpid函数 245
8.2.5  进程的一生 251
8.2.6  用户ID和组ID 251
8.2.7  system函数 253
8.3  多个进程间的关系 255
8.3.1  进程组 255
8.3.2  会话期 256
8.3.3  控制终端 257
8.4  本章小结 259
实战演练 259
第9章 信号 260
9.1  Linux信号简介 261
9.1.1  信号的基本概念 261
9.1.2  信号处理机制 265
9.2  信号操作的相关函数 267
9.2.1  信号的处理 267
9.2.2  信号的发送 274
9.2.3  信号的阻塞 282
9.2.4  计时器与信号 284
9.3  本章小结 286
实战演练 287
第10章 进程间通信 288
10.1  进程间通信简介 289
10.2  管道 290
10.2.1  管道的概念 290
10.2.2  管道的创建与关闭 291
10.2.3  管道的读写 292
10.3  命名管道 297
10.3.1  命名管道的概念 297
10.3.2  命名管道的创建 297
10.3.3  命名管道的读写 299
10.4  消息队列 303
10.4.1  消息队列的概念 303
10.4.2  消息队列的创建与打开 305
10.4.3  消息队列的读写 306
10.4.4  获得或设置消息队列属性 308
10.5  共享内存 312
10.5.1  共享内存的概念 312
10.5.2  共享内存的相关操作 313
10.6  信号量 318
10.6.1  信号量的概念 319
10.6.2  信号量集的相关操作 320
10.7  本章小结 325
实战演练 326
第11章 网络编程 327
11.1  网络编程的基础知识 328
11.1.1  计算机网络体系结构 328
11.1.2  传输控制协议TCP 333
11.1.3  用户数据报协议UDP 335
11.1.4  客户机/服务器模式 336
11.2  套接口编程基础 336
11.2.1  什么是套接口 337
11.2.2  端口号的概念 338
11.2.3  套接口的数据结构 338
11.2.4  基本函数 340
11.3  TCP套接口编程 343
11.3.1  TCP套接口通信工作流程 343
11.3.2  TCP套接口Client/Server程序实例 356
11.4  UDP套接口编程 360
11.4.1  UDP套接口通信工作流程 360
11.4.2  UDP套接口Client/Server程序实例 362
11.5  原始套接口编程 365
11.5.1  原始套接口的创建 365
11.5.2  原始套接口程序实例 365
11.6  本章小结 376
实战演练 376
第12章 Linux图形界面编程 377
12.1  Linux下的图形界面编程简介 378
12.1.1  Qt简介 378
12.1.2  GTK+简介 378
12.2  界面基本元件 381
12.2.1  一个简单的例子 381
12.2.2  窗口 383
12.2.3  标签 385
12.2.4  按钮 386
12.2.5  文本框 387
12.3  界面布局元件 389
12.3.1  表格 390
12.3.2  框 393
12.3.3  窗格 395
12.4  其他常用元件 398
12.4.1  进度条、微调按钮、组合框 398
12.4.2  单选按钮、复选按钮 402
12.4.3  下拉菜单 404
12.5  信号与回调函数 406
12.6  本章小结 409
实战演练 409
第3部分 实战篇
第13章 设计Linux下的计算器 411
13.1  软件功能分析 412
13.2  程序模块的划分 413
13.3  软件的具体实现 415
13.3.1  头文件 415
13.3.2  十六进制界面显示函数 416
13.3.3  十进制界面显示函数 417
13.3.4  八进制界面显示函数 418
13.3.5  二进制界面显示函数 419
13.3.6  进制间转换函数 420
13.3.7  信号处理模块 423
13.3.8  主函数 432
13.4  软件使用效果演示 438
13.5  本章小结 439
第14章 Linux平台下聊天软件的设计 440
14.1  软件功能概述 441
14.1.1  服务器端功能需求 441
14.1.2  客户端功能需求 442
14.1.3  错误处理需求 442
14.2  Glade集成开发工具简介 443
14.3  软件功能模块划分 444
14.3.1  服务器功能模块划分 444
14.3.2  客户端功能模块划分 445
14.3.3  消息标识的定义 445
14.3.4  消息结构体的设计 446
14.4  服务器程序的具体实现 447
14.4.1  服务器消息处理流程 447
14.4.2  服务器主要函数和变量 448
14.4.3  服务器消息处理模块的设计与实现 449
14.4.4  服务器数据存储的方法 450
14.4.5  用户注册流程 450
14.5  客户端程序的具体实现 451
14.5.1  客户端操作流程 451
14.5.2  客户端发送和接收消息流程 451
14.5.3  客户端主要函数和变量 452
14.5.4  客户端功能模块的设计与实现 453
14.6  聊天软件使用效果演示 455
14.7  本章小结 459
第15章 Linux远程管理工具的设计 460
15.1  软件功能概述 461
15.1.1  Webmin简介 461
15.1.2  软件总体设计 461
15.2  服务器端程序设计 463
15.2.1  服务器端工作流程 463
15.2.2  系统用户管理操作 464
15.2.3  系统用户组的管理操作 466
15.2.4  系统服务启动管理 468
15.2.5  DNS管理操作 469
15.2.6  Apache服务管理操作 471
15.2.7  FTP服务管理操作 474
15.3  客户端程序 475
15.3.1  连接界面 475
15.3.2  主界面 477
15.4  本章小结 479
第16章 Linux下简易防火墙软件的设计 480
16.1  Netfilter基础 481
16.1.1  什么是Netfilter 481
16.1.2  Netfilter的HOOK机制 482
16.1.3  HOOK的调用 485
16.1.4  HOOK的实现 486
16.1.5  IPTables简介 488
16.1.6  Netfilter可以实现的控制功能 489
16.2  软件设计概述 491
16.2.1  软件整体框架 491
16.2.2  管理端的设计 492
16.2.3  控制端的设计 493
16.3  用Netfilter设计控制端功能模块 495
16.3.1  ICMP管理控制模块 495
16.3.2  FTP管理控制模块 497
16.3.3  HTTP管理控制模块 499
16.3.4  模块的编译、加载与卸载 499
16.4  软件功能测试 501
16.5  本章小结 503
第17章 基于Linux的嵌入式家庭网关远程交互操作平台的设计 504
17.1  嵌入式技术简介 505
17.1.1  嵌入式系统的概念 505
17.1.2  嵌入式操作系统 506
17.1.3  嵌入式处理器 507
17.2  家庭网关的概念及其网络体系结构 509
17.2.1  智能家庭网络的概念 509
17.2.2  家庭网关的远程交互操作技术简介 510
17.2.3  嵌入式家庭网关的网络体系结构 510
17.3  嵌入式家庭网关的开发平台 511
17.3.1  S3C2410微处理器简介 511
17.3.2  交叉编译环境的建立 513
17.4  远程交互平台的设计 515
17.4.1  应用软件的开发模式 515
17.4.2  嵌入式Web服务器 516
17.4.3  通用网关接口CGI 519
17.5  Linux下软件模块的具体实现 520
17.5.1  登录验证模块 521
17.5.2  串口通信模块 521
17.5.3  中央空调控制模块 522
17.5.4  智能水表数据采集模块 528
17.5.5  试验结果 528
17.6  本章小结 529