
本书介绍使用C语言结合Linux API进行系统级程序设计的方法,主要包括Linux基础知识、C程序开发工具、文件及目录管理、进程管理、重定向与管道、信号、进程间通信、线程、线程间的同步机制、网络程序设计等10章,以及10个实验,全面而系统地介绍Linux操作系统各种机制的实现原理、经常使用的系统接口函数、系统接口和命令程序之间的关系以及命令程序的实现过程等。
本书结构清晰,适合于教学,为各类高等学校开设开源软件程序设计课程提供了一个切实可行的思路,同时也可作为培训教材在各类培训机构使用。书中各章节划分明确,各章突出不同的重点,有利于教师组织安排授课内容;同时提供设计精美、内容丰富的电子教案以及教学素材供授课教师使用,有效地减轻了授课教师备课的工作量和强度。
本书目标读者为具有一定C语言基础的读者,适合各类高等院校的计算机及相关专业学生、Linux培训机构、Linux API编程爱好者、Linux程序开发人员及爱好者学习使用。
出于安全、稳定等因素的考虑,开源软件受到了各行各业的青睐,其中以Linux操作系统最为突出。作为当前最为流行的操作系统之一——Linux已发展得较为成熟,其良好的稳定性和优异的性能带给各类用户优越的体验。Linux系统的使用范围越来越广,随之而来的是Linux环境下各类应用软件需求的暴增。学习Linux环境编程对提高IT从业者的竞争力和整个软件行业的发展无疑是相当有意义的。
本书以培养Linux系统程序分析能力为目标,以命令程序设计为驱动。在解决问题的过程中始终以培养分析问题的能力为基础,介绍有效使用Linux在线手册的方法,从而找到解决问题的突破口,进一步找到合适的系统调用接口,设计相关的命令程序,最终解决问题。
C语言是广大程序设计人员都已掌握的一门程序设计语言,同时也是实现Linux系统所使用的程序设计语言。本书使用C语言结合Linux API进行程序设计,全书共分为10章,内容如下所述:
第1章Linux基础知识,介绍Linux操作系统的发展情况以及系统编程的概念,同时还介绍Linux系统中的一些常用工具及命令。
第2章C程序开发工具,介绍Linux环境下编写C语言程序所要用到的一些工具,包括vim、gcc、gdb、makefile等。
第3章文件及目录管理,介绍POSIX标准下文件的各类I/O操作以及与流文件的关系和相互转换。
第4章进程管理,介绍在Linux环境中程序和进程的关系、进程的基本属性、一个进程从生到死的全过程,最后介绍Linux系统中的一些特殊进程。
第5章重定向与管道,以实现重定向命令为引入点,重点介绍使用管道实现进程间通信的方法。
第6章信号,介绍信号的几种处理策略和信号在进程间通信中的使用方式。
第7章进程间通信,介绍使用共享内存、信号量和消息队列来实现进程间通信的方法,同时总结Linux环境下进程间通信的所有机制。
第8章线程,介绍线程的基本概念和基本操作。
第9章线程间的同步机制,介绍线程间的通信机制以及线程同步互斥的问题。〖1〗Linux环境高级程序设计[3]〖3〗第10章网络程序设计,介绍套接字机制在不同主机的进程间如何实现通信以及在Linux环境下网络套接字编程的基本方法。
其中第5~7章以及第10章都是有关于进程间通信机制的内容。
为检查各章的学习情况,本书最后配备了相应的实验。
作为Linux环境程序设计的入门教材,本书语言简练、论述由浅入深,并辅以大量的示例程序和丰富的图表,使读者能够更好地理解各种抽象的概念和关系,帮助读者理解全书内容。本书面向各类高等院校的计算机相关专业学生以及对开源环境程序设计有兴趣的编程爱好者,要求读者有一定的C语言编程基础。书中除了讲解程序的设计实现之外,着重讲解解决问题的分析过程,力求使读者掌握问题的分析方法,逐步培养读者具有在Linux环境下独立设计和实现应用级甚至系统级程序的能力。
需要说明的一点是,由于系统调用从C语言语法的角度上来看与函数没有区别,因此在本书中不会引起歧义的地方并没有严格区分系统调用和库函数的表述。如果需要明确某一表述是系统调用还是库函数,可以使用man手册查找。man手册的第2章为系统调用,第3章为库函数。
本书主要由黄茹主编,王小银、张丽丽为副主编。其中黄茹编写了第1、4、5、6、7章;王小银编写了第8、9、10章;张丽丽编写了第2、3章;最后由黄茹负责对全书进行了统稿。此外,在本书的编写过程中,感谢陈莉君、舒新峰、刘霞林、王春梅对本书提出了宝贵的意见。
尽管本书经过了编者反复的修改,但由于编者水平和经验有限,时间仓促,书中难免存在错漏之处,殷切希望广大读者批评指正。
编者
2019年1月
第1章Linux基础知识/1
1.1Linux简介1
1.1.1Linux系统的发展1
1.1.2与Linux相关的一些知识3
1.2Linux系统编程5
1.2.1什么是系统编程5
1.2.2系统编程的学习内容及方法6
1.2.3一个例子7
1.2.4系统调用和库函数10
1.3常用工具及命令10
1.3.1命令格式10
1.3.2常用工具11
1.3.3常用命令15
1.3.4获取帮助17
1.4小结20
习题20
第2章C程序开发工具/22
2.1编辑工具22
2.1.1编辑工具介绍22
2.1.2vi和vim程序编辑器25
2.2gcc编译器34
2.3gdb调试器36
2.3.1启动和退出gdb37
2.3.2显示和查找程序源代码38
2.3.3执行程序和获取帮助39
2.3.4设置和管理断点40
2.3.5查看和设置变量的值45
2.3.6控制程序的执行46
2.4make和Makefile48〖1〗Linux环境高级程序设计[3]〖3〗2.4.1make命令48
2.4.2编写Makefile文件50
2.5小结54
习题55
第3章文件及管理/56
3.1文件和I/O操作分类56
3.1.1文件概念56
3.1.2文件操作分类56
3.2Linux文件系统概述58
3.2.1文件结构58
3.2.2文件系统模型59
3.2.3、索引结点和文件描述符60
3.2.4文件的分类63
3.2.5文件访问权限控制64
3.3文件的读写68
3.3.1文件打开、创建和关闭69
3.3.2文件的读写72
3.3.3文件读写指针的移动80
3.3.4标准I/O的文件流82
3.4文件属性及相关系统调用87
3.4.1获取文件属性87
3.4.2修改文件的访问权限91
3.4.3修改文件的用户属性93
3.4.4获取用户的信息94
3.4.5改变文件大小95
3.4.6获取文件的时间属性96
3.5操作97
3.5.1打开97
3.5.2读取项98
3.5.3关闭98
3.6实现自己的ls命令100
3.7小结105
习题106
第4章进程管理/107
4.1Linux可执行程序的存储结构与进程结构107
4.1.1Linux可执行程序的存储结构107
4.1.2Linux系统的进程结构109
4.1.3进程树110
4.2进程的环境和进程属性111
4.2.1进程的环境111
4.2.2进程的状态112
4.2.3进程的基本属性115
4.2.4进程的用户属性121
4.3进程管理124
4.3.1创建进程124
4.3.2在进程中运行新代码127
4.3.3vfork函数131
4.3.4进程退出133
4.3.5wait函数138
4.3.6Shell的实现流程142
4.4Linux中的特殊进程143
4.4.1孤儿进程143
4.4.2僵尸进程144
4.4.3守护进程145
4.4.4出错记录148
4.5小结150
习题150
第5章重定向与管道/151
5.1重定向和管道命令151
5.1.1重定向命令151
5.1.2管道命令152
5.2实现重定向153
5.2.1重定向的实施者153
5.2.2实现重定向的前提条件154
5.2.3dup和dup2154
5.2.4重定向的三种方法157
5.2.5ls l>list.txt159
5.3管道编程161
5.3.1匿名管道161
5.3.2命名管道165
5.3.3ls l|grep root168
5.3.4popen和pclose170
5.4小结173
习题174
第6章信号/175
6.1信号概述175
6.1.1什么是信号175
6.1.2信号的来源和处理过程177
6.1.3信号的处理方式177
6.2早期信号处理函数——signal178
6.2.1signal函数实现信号的三种处理方式178
6.2.2signal函数存在的问题182
6.3信号处理函数——sigaction183
6.3.1sigaction系统调用183
6.3.2sigaction函数参数的说明186
6.4信号其他相关函数190
6.4.1kill与raise190
6.4.2alarm与pause192
6.4.3实现sleep函数193
6.5小结194
习题195
第7章进程间通信/196
7.1选择进程间通信方式196
7.1.1文件实现进程间通信196
7.1.2命名管道实现进程间通信199
7.2共享内存201
7.2.1什么是共享内存201
7.2.2共享内存相关系统调用203
7.2.3共享内存实现进程间通信206
7.2.4三种通信方式的比较208
7.3信号量209
7.3.1信号量及相关系统调用209
7.3.2使用信号量控制对共享内存的访问214
7.3.3信号量机制总结221
7.4System V IPC222
7.4.1Linux中的进程通信机制222
7.4.2System V IPC概述223
7.4.3IPC的标识符和键224
7.5消息队列225
7.5.1消息队列的概念225
7.5.2消息队列相关系统调用226
7.5.3使用消息队列实现进程间通信229
7.6小结232
习题232
第8章线程/233
8.1线程概述233
8.1.1线程的定义233
8.1.2用户级线程和内核级线程234
8.1.3线程与进程的对比234
8.2线程基本操作235
8.2.1线程创建235
8.2.2线程退出/等待238
8.2.3线程终止244
8.2.4线程挂起247
8.2.5线程的分离249
8.2.6线程的一次性初始化251
8.2.7线程的私有数据253
8.3线程属性257
8.3.1线程属性对象258
8.3.2设置/获取线程detachstate属性260
8.3.3设置与获取线程栈相关属性261
8.4线程应用举例266
8.5小结273
习题273
第9章线程间的同步机制/275
9.1互斥锁275
9.1.1互斥锁基本原理275
9.1.2互斥锁基本操作275
9.1.3互斥锁应用实例278
9.2条件变量279
9.2.1条件变量基本原理279
9.2.2条件变量基本操作279
9.2.3条件变量应用实例281
9.3读写锁284
9.3.1读写锁基本原理284
9.3.2读写锁基本操作284
9.3.3读写锁应用实例287
9.4线程与信号289
9.4.1线程信号管理290
9.4.2线程信号应用实例291
9.5小结295
习题295
第10章网络程序设计/296
10.1网络知识基础296
10.1.1TCP/IP参考模型296
10.1.2Linux中TCP/IP网络的层结构296
10.1.3TCP协议297
10.1.4UDP协议298
10.2套接字299
10.2.1套接字概述299
10.2.2套接字编程接口300
10.2.3套接字通信流程303
10.3套接字基础307
10.3.1套接字地址结构307
10.3.2字节顺序309
10.3.3字节处理函数310
10.4套接字编程311
10.4.1基于TCP协议的网络通信311
10.4.2基于UDP协议的网络通信316
10.5小结319
习题319
附录实验/321
实验1Linux基础知识321
实验2C程序开发工具321
实验3文件I/O操作322
实验4进程管理及守护进程323
实验5重定向和管道编程323
实验6信号安装及处理方式324
实验7System V IPC进程通信325
实验8线程管理325
实验9线程间通信326
实验10套接字编程326
循序渐进地进入Linux环境下系统级程序设计
循序渐进地进入Linux环境下系统级程序设计