Linux系统程序设计 (第三版)

Linux系统程序设计 (第三版) 教材名称: Linux系统程序设计 (第三版)
ISBN号: 978-7-89436-926-0 作者: 王凯
字数: 620千字 规格: 16开
印制时间: 出版日期: 2022-02-01
定价: 58 元 样章下载: Linux系统程序设计(第三版)—样章.pdf
购买地址:

一、教材的基本信息
1.适用对象
本教材适用于计算机相关专业本科Linux环境下程序设计相关课程的教学,可供本科高年级学生自学使用,也可以作为相关工程技术人员和计算机爱好者学习Linux系统编程的参考资料。
2.具备的知识和能力基础
本教材需要读者理解操作系统原理,并具备C语言编程能力和Linux基本操作技能。
3.预期达到的学习效果
通过本教材的学习,希望使读者能了解Linux操作系统的基本组成和工作原理,掌握基于Linux系统的C语言编程方法,能熟练地基于Linux系统进行C/C++应用程序开发。
4.编写团队
参与编写本教材的都是具有丰富教学经验的老师,在操作系统、Linux管理与应用、C/C++编程开发、嵌入式软件开发、移动应用软件开发等领域具有多年的教学和实践经验。
二、教材的基本结构与内容组织
1.教材的基本结构
本教材以两个基于Linux系统的工程项目为例,以项目为核心将知识与技能有机地结合在一起,介绍了Linux系统开发的相关知识以及完成该项目工程的技能。另外本教材中设置【基本知识】【知识验证】【创新能力】等环节,将知识和技能清晰地展示出来。
2.教材的内容组织
本教材主要讲解基于Linux平台的文件、进程、进程间通信相关的编程理论和方法,共分为13章。
第1章介绍Linux操作系统的基本使用方法;第2章介绍Linux平台下进行C语言开发需要的各种工具;第3章介绍Linux平台下常用的编程基础知识;第4章到第6章介绍文件、文件属性、目录文件相关的编程理论和方法;第7章和第8章介绍进程和线程的编程方法;第9章到第11章介绍信号、管道、信号量、共享内存、消息队列、Socket六种进程间通信方式。最后,第12章和13章分别是贯穿了本教材大多数知识点的综合项目,其中第12章是网络编程项目,第13章是应用libcurl库的项目。
本教材各章节关系图
*粗线走向为综合项目贯穿本教材的各个章节顺序。
*细线走向为本教材中相对独立的三大知识体系:文件(4、5、6),进程(7、8),进程间通信(9、10、11);1、2、3章是这三大知识体系的支撑。
项目导学
Linux的开源内核使Linux操作系统的应用领域十分广泛,在个人桌面领域、嵌入式移动领域和服务器领域等,都有Linux的一席之地,也占据了一定市场份额,特别是在嵌入式移动领域和服务器领域尤为明显。本教材有两个综合项目,Linux网络传输系统和简易的数据传输工具。通过这两个综合项目,使读者能迅速地掌握Linux系统环境中进行应用程序开发最核心的技术。
项目一Linux网络传输系统
该系统分为客户端程序和服务器端程序,分别运行在网络中不同的安装有Linux操作系统的计算机上。它们之间可以建立连接并进行数据的传输,还可以将接收到的数据保存在文件中。
图1项目结构图
(1)服务器端:可以通过多进程/多线程(应更侧重多线程)并发服务器方式与客户端通信。接受客户端连接后,显示客户端IP,接收客户端发来的数据并显示到屏幕上,然后将该数据反转后发回给客户端。如果客户端发来“bye”,给客户端返回信息后断开与客户端的连接。
(2)客户端:与服务器建立连接后,从键盘获取数据并发送给服务器,然后接收服务器发来的信息并显示到屏幕上。如果键盘输入“bye”,则断开与服务器的连接。另外将建立连接、发送数据、接收数据、断开连接过程的时间及相关信息写入日志文件(日志文件名在连接建立成功后根据用户输入的用户名确定)。
项目二简易的数据传输工具
该项目以libcurl库为主要技术,综合文件等相关内容完成以下几个功能:
①显示文件。在终端显示指定URL的文件内容;
②下载文件。将指定文件URL下载到本地磁盘;
③复制文件。将本地磁盘文件复制到指定的文件系统中;
④上传文件。将本地磁盘文件上传到指定的URL。(需要运行Web服务端程序接收上传的文件)
对于只有C语言编程基础和只熟悉Linux基本操作的读者来说,首先需要对Linux操作系统有一个了解。在第1章中将介绍一些专业术语,系统调用的概念以及Linux下一些常用命令。
要进行项目的开发,首先要清楚开发的流程以及所使用的工具。第2章介绍Linux下项目开发的环境及开发步骤,包括编辑器、编译器、项目调试、Makefile以及函数库。
在两个项目中,程序将设计文件的读写和保存,还要考虑到其他用户对该文件的访问权限。为此,我们还要学习Linux中有关文件、用户对文件的访问权限、文件所在目录等知识。本教材中的第4章介绍文件的基本I/O操作,第5章介绍文件属性管理,第6章介绍目录相关的编程方法。
在项目运行时,用户可以在终端输入指定服务器IP地址,另外在Linux系统中,用户程序都是以进程的形式运行,所以第7章首先学习有关进程的编程知识,然后通过一个“实现简单的Shell”的小项目来掌握进程编程的技能。当服务器需要处理多个客户端请求时,需要采用并发方式完成,可以采用多进程或多线程,线程将在第8章介绍。
网络传输属于进程间通信的一种。Linux系统中进程间通信的方式有很多,而且在实际开发中也会经常用到这些通信方式。本教材的第9章介绍信号和管道,第10章介绍消息队列、共享内存、信号量。第11章专门介绍网络通信,即Socket通信。
在完成了上述知识的学习和小项目的训练后,在第12章将完成该项目的构思、设计、实施和运行。另外在基本开发技能基础上,网络上有很多优秀的库包括了丰富且使用的功能,因此第13章引入第三方库libcurl完成一个简易的数据传输工具。第1章Linux操作系统基础1
 
第1章Linux操作系统基础1
1.1UNIX/Linux操作系统简介1
1.1.1UNIX发展历史1
1.1.2UNIX体系结构3
1.1.3Linux操作系统发展历史3
1.1.4Linux的版本4
1.1.5Linux操作系统特点5
1.1.6UNIX/Linux应用领域7
1.2相关术语7
1.2.1操作系统7
1.2.2多用户系统8
1.2.3用户和组8
1.2.4进程8
1.2.5文件9
1.2.6硬链接和符号链接9
1.2.7文件类型10
1.2.8文件描述符与索引节点10
1.3库函数与系统调用10
1.4Linux常用命令11
1.4.1用户和用户组11
1.4.2文件和目录13
1.4.3进程17
1.4.4获取帮助信息18
1.5项目:SSH终端及登录20
1.5.1项目分析及设计20
1.5.2项目实施20
1.5.3项目运行22
习题25第2章Linux平台项目开发环境28
2.1编辑器Vim28
2.1.1Vim的工作模式29
2.1.2Vim的基本用法30
2.1.3Vim的高级用法30
2.2编译器GCC32
2.2.1GCC编译器介绍32
2.2.2GCC编译器基本用法33
2.3make及Makefile36
2.3.1Makefile36
2.3.2Makefile文件的命名37
2.3.3Makefile文件的调用37
2.3.4Makefile文件的内容38
2.3.5make命令的特殊用法42
2.4调试器GDB42
2.4.1输出语句调试方法42
2.4.2GDB工具调试43
2.5库47
2.5.1库的基本概念47
2.5.2静态库和共享库的创建与使用48
2.6项目:学生成绩计算50
2.6.1项目分析及设计50
2.6.2项目实施52
2.6.3项目编译及运行54
习题55
第3章Linux程序设计初步57
3.1程序及进程的存储结构57
3.2变量的类型修饰符59
3.3命令行参数63
3.4环境变量66
3.4.1Shell变量66
3.4.2环境变量列表68
3.4.3环境变量相关函数69
3.5时间管理71
3.5.1时间及其表示71
3.5.2获取时间相关函数73
3.5.3设置系统时间相关函数743.6错误代码77
3.7标准I/O与文件I/O83
3.8项目:设置环境变量85
3.8.1项目分析与设计85
3.8.2项目实施86
3.8.3项目编译与运行86
习题87
第4章文件I/O89
4.1文件系统简介89
4.1.1UNIX/Linux文件系统概述90
4.1.2VFS虚拟文件系统94
4.1.3索引节点inode94
4.1.4文件的类型95
4.1.5文件的访问权限98
4.2访问文件的内核数据结构99
4.3文件基本I/O操作101
4.3.1打开/创建文件open/creat101
4.3.2读文件106
4.3.3写文件108
4.3.4文件定位110
4.3.5关闭文件113
4.3.6文件操作举例113
4.4文件访问的同步116
4.5项目:文件复制命令的实现117
4.5.1项目分析与设计117
4.5.2项目实施119
4.5.3项目编译与运行120
习题120
第5章文件属性管理123
5.1获取文件属性123
5.2用户/组ID与名字的转换128
5.2.1用户信息的存储与获取129
5.2.2用户组信息的存储与获取130
5.3硬链接与符号链接132
5.3.1硬链接与符号链接的区别132
5.3.2链接文件相关的系统调用函数135
5.4dup/dup2138
5.4.1输入输出重定向138
5.4.2dup/dup2函数139
5.5文件属性的修改142
5.5.1修改文件属性142
5.5.2改变文件主及组chown/fchown/lchown143
5.5.3改变文件访问权限chmod/fchmod145
5.5.4改变文件时间utime146
5.5.5改变文件长度truncate/ftruncate148
5.6项目:显示文件长格式信息150
5.6.1项目分析与设计150
5.6.2项目实施150
5.6.3项目编译与运行154
习题155
第6章目录文件管理157
6.1目录基本操作157
6.1.1打开目录158
6.1.2读目录158
6.1.3关闭目录160
6.2目录其他操作162
6.2.1切换当前目录162
6.2.2创建目录164
6.2.3删除目录165
6.2.4目录指针定位166
6.3项目:显示指定目录下文件列表167
6.3.1项目分析与设计167
6.3.2项目实施167
6.3.3项目编译与运行172
习题173
第7章进程控制175
7.1什么是Shell175
7.1.1用户登录Shell176
7.1.2Shell执行命令176
7.2进程基本概念177
7.2.1进程标识178
7.2.2用户标识178
7.3进程控制相关函数181
7.3.1创建进程181
7.3.2exec*函数190
7.3.3进程终止194
7.3.4等待进程结束195
7.3.5system函数202
7.4项目:实现简单的Shell205
7.4.1项目分析与设计205
7.4.2项目实施205
7.4.3项目编译与运行208
习题209
第8章线程210
8.1线程概念210
8.2线程基本操作212
8.3线程间同步218
8.3.1互斥锁218
8.3.2条件变量221
8.3.3无名信号量221
8.3.4自旋锁222
8.3.5屏障222
8.3.6读写锁223
8.4项目:线程实例223
8.4.1项目分析与设计223
8.4.2项目实施224
8.4.3项目编译与运行226
习题229
第9章信号与管道231
9.1信号231
9.1.1信号的概念231
9.1.2信号的产生232
9.1.3信号的响应方式237
9.1.4sleep和pause240
9.1.5信号集243
9.2管道253
9.2.1管道基本概念253
9.2.2FIFO260
习题263
第10章进程间通信(IPC)265
10.1System V IPC介绍265
10.2System V信号量268
10.3System V共享内存274
10.4System V消息队列279
习题287
第11章网络编程288
11.1网络编程基本概念288
11.1.1常用网络相关命令和配置文件288
11.1.2软件体系结构292
11.1.3网络协议及OSI参考模型294
11.1.4IP地址和端口297
11.1.5字节顺序299
11.1.6网络数据传输方式302
11.2套接字编程基础303
11.2.1套接字简介303
11.2.2套接字地址结构304
11.2.3面向连接套接字通信过程306
11.2.4面向无连接套接字通信过程307
11.3套接字编程相关函数308
11.3.1socket308
11.3.2bind309
11.3.3listen310
11.3.4accept311
11.3.5connect312
11.3.6send312
11.3.7recv313
11.3.8close314
11.3.9sendto314
11.3.10recvfrom315
11.4项目:基于网络的进程间通信316
11.4.1项目分析与设计316
11.4.2项目实施317
11.4.3项目运行320
11.5项目:基于UDP的网络编程323
11.6域名解析327
11.6.1域名解析327
11.6.2IP地址形式转换329
11.6.3IP地址与主机名331
习题337
第12章Linux网络传输系统339
12.1项目构思339
12.2项目设计340
12.3项目实施341
12.4项目运行348
习题351
第13章简易的数据传输工具352
13.1项目构思352
13.2项目设计353
13.3项目实施353
13.3.1libcurl的安装353
13.3.2libcurl基本用法356
13.3.3源代码357
13.3.4编译364
13.4项目运行364
习题365
附录A:Linux主要的系统调用366
附录B:标准374
附录C:ASCII码377
附录D:学习知识要点及能力要点379
参考文献385
 
一、本教材主要特点
(1)以项目为核心,以CDIO工程教育理念为指导思想。不仅介绍基于Linux系统进行程序设计的相关知识,还注重Linux工程项目能力的训练。
(2)本教材的内容包括知识讲解和技能训练,并以项目为核心,将知识与技能有机地结合在一起。本教材以典型的Linux系统工程项目为主线贯穿教材展开各部分的知识。在每一章中除了介绍相关知识外,又辅以若干个小项目的训练,将知识转化为解决问题的技能。
(3)以多年开发与教学经验为基础。编者具有多年讲授Linux程序设计相关课程的经历,积累了不少教学与开发的经验。
(4)本教材内容与Linux系统内核相结合。要掌握基于Linux系统的程序设计,就需要对Linux系统的内核有所了解。例如在学习Linux文件相关程序的开发时,如果了解了Linux文件系统的管理机制,尤其是管理文件的内核数据结构,那么就可以深入理解文件访问、管理的原理,就可以做到编写程序时不仅“知其然”,还可以“知其所以然”。
(5)本教材中包括基本知识、知识验证、创新能力等内容。其中:
【基本知识】主要介绍Linux系统程序设计的核心工程基础知识;
【知识验证】主要是在学习了基本知识之后,对基本知识的验证;
【创新能力】主要是基本知识学习的基础上进行进一步的思考。
二、本教材的编写工作
本教材由多年从事操作系统、UNIX/Linux程序设计教学的老师编写完成。其中余新桥负责编写第1章,王凯负责编写第2、3、11章,孙斌负责编写4、5、6、12章,杨俊伟老师负责编写第8章,杨光老师负责编写第7、9、10章。
本次教材再版,参与修订的人员有杨光、周海波、杨俊伟,在以下几方面进行了再版:
(1)通过调研,教材所有案例项目都在Ubuntu20版本系统上运行和测试,对于系统不兼容的部分做了更新。
(2)将大部分的案例和项目引入关联的实际应用背景,使案例项目目标导向更明确。
(3)对一些系统调用和函数,增加了案例应用。
(4)修订了原教材中部分内容不确切的地方,更正了文字中的错误。
通过对本教材的反复使用,不断发现教材中的不足,不断改进和完善,力求使之更加符合高等本科教育培养目标的要求,以方便教学和学习。由于修改时间有限,可能还存在很多暂未发现的瑕疵,欢迎各位同行、读者批评指正。