内容简介
《Linux编程》全面讲述Linux环境下基于C语言的系统编程技术以及相关的理论原理,主要内容包括Linux基本操作、Shell编程、系统I/O编程、文件系统、进程控制原理、多进程并发编程、信号机制、线程概念、多线程并发编程、同步与互斥的概念、基于信号量与P/V操作解决同步及互斥问题、经典同步问题、网络编程、并发网络应用编程等,《Linux编程》安排有大量的程序实例、课后作业,还设计了很多示意图,以帮助读者理解、运用书中介绍的概念、原理和技术。
《Linux编程》内容丰富、结构合理、思路清晰、语言简明流畅、示例翔实,可作为高等院校计算机类专业操作系统、Linux编程等课程的教材,还可作为C程序设计、嵌入式开发的参考资料。
目录
第1章Linux系统文件操作1
1.1UNIX/Linux操作系统简介1
1.1.1UNIX简介1
1.1.2Linux概述2
1.2Linux系统目录结构3
1.3Linux系统的安装、启动、登录、
用户界面与命令格式5
1.3.1在VMware中用快照快速安装
Linux虚拟机系统5
1.3.2启动与登录Linux5
1.3.3三种系统操作界面6
1.3.4Linux命令格式和说明7
1.4Linux文件、目录操作及文件
属性、权限9
1.4.1目录路径与目录操作9
1.4.2文件属性与权限13
1.4.3Linux文件操作命令14
1.4.4修改文件属性19
1.4.5使用通配符(“*”和“?”)匹配
文件名21
1.4.6文件的压缩与打包22
1.5输入输出重定向和管道23
1.6本章小结24
课后作业25
第2章LinuxShell编程26
2.1Shell编程基本概念26
2.1.1Shell脚本程序的结构27
2.1.2Shell脚本的创建与执行方法27
2.1.3Shell变量与赋值表达式28
2.1.4Shell输入输出语句29
2.1.5终止脚本执行和终止状态29
2.2Shell数学运算与字符串处理32
2.2.1Shell数学运算32
2.2.2Shell字符串处理32
2.3Shell条件与if控制结构33
2.3.1if语句34
2.3.2test命令36
*2.3.3复合条件检查39
2.3.4case语句40
2.4循环结构40
2.4.1for循环结构41
2.4.2while循环结构42
2.4.3until循环结构43
2.5Linux全局变量和环境变量44
2.5.1LinuxShell层次结构44
2.5.2Shell全局变量与局部变量45
2.5.3Linux环境变量46
*2.5.4Shell变量的删除和只读设置
方法48
2.5.5Shell数组的定义和使用方法48
2.6Linux文件I/O、I/O重定向和管道49
2.6.1标准文件描述符49
2.6.2I/O重定向50
2.6.3管道51
2.6.4从文件获取输入52
2.7命令行参数52
*2.8Shell函数53
*2.8.1函数的基本用法53
*2.8.2向函数传递参数54
2.9本章小结54
课后作业55
第3章LinuxC编程环境57
3.1LinuxC程序的编译与执行57
3.1.1Linux环境下C程序的编译与
执行过程57
3.1.2编译多个源文件61
3.1.3使用头文件和库文件62
*3.1.4使用gcc创建自定义库文件65
3.1.5gcc常用命令选项及用法67
3.2Linux常用自带系统库68
3.2.1数学函数68
3.2.2环境控制函数69
3.2.3字符串处理函数69
3.2.4时间函数70
3.2.5数据结构算法函数71
3.3诊断和处理Linux编程错误75
3.3.1诊断和处理编译错误75
3.3.2处理系统调用失败80
3.3.3用断言检查程序状态错误84
*3.4用GDB/ddd调试器诊断运行
错误85
*3.4.1用GDB调试程序运行错误的
实例85
*3.4.2常用GDB命令88
*3.4.3用ddd/GDB调试程序89
3.5命令行参数和环境变量的
读取方法90
3.5.1环境变量及其使用方法90
3.5.2命令行参数的使用方法91
*3.6make工具92
*3.6.1引入make工具的原因92
*3.6.2用makefile描述源文件间的
依赖关系93
*3.6.3引入伪目标以增强makefile功能94
*3.6.4用变量优化makefile文件95
3.6.5用预定义变量和隐含规则
简化makefile文件96
3.7本章小结97
课后作业98
第4章输入输出与文件系统101
4.1文件系统层次结构101
4.1.1文件系统层次结构简介101
4.1.2文件I/O库函数102
4.2系统I/O概念与文件操作编程103
4.2.1UNIXI/O103
4.2.2文件打开和关闭函数104
4.2.3文件读写编程与读写性能
改进方法107
4.2.4文件定位与文件内容随机读取111
4.2.5任意类型数据的文件读写113
4.2.6用文件读写函数操作设备115
4.3内核文件I/O数据结构及应用117
4.3.1文件描述符和标准输入输出117
4.3.2文件打开过程118
4.3.3内核文件I/O数据结构共享原理119
4.3.4dup和I/O重定向120
*4.4用RIO包增强UNIXI/O功能124
*4.4.1RIO的无缓冲的输入输出函数124
*4.4.2RIO带缓冲的输入函数125
4.5文件组织128
4.5.1文件属性、目录项与目录128
4.5.2逻辑地址与物理地址129
4.5.3创建和读写文件130
4.5.4一体化文件目录和分解目录132
4.5.5Linux分解式目录管理133
4.5.6读取文件元数据135
4.5.7文件搜索和当前目录136
4.6文件物理结构137
4.6.1外存组织方式137
4.6.2管理磁盘空闲盘块141
4.6.3文件系统结构格式143
4.7本章小结144
课后作业144
第5章进程管理与控制151
5.1逻辑控制流和并发流151
5.2进程的基本概念153
5.2.1进程概念、结构与描述153
5.2.2进程的基本状态及状态转换155
5.2.3对进程PCB进行组织156
5.2.4进程实例157
5.2.5操作进程的工具158
5.2.6编程读取进程属性160
*5.2.7进程权限和文件特殊权限位161
5.3进程控制163
5.3.1创建进程163
5.3.2多进程并发特征与执行流程
分析170
5.3.3进程的终止与回收173
5.3.4让进程休眠177
5.3.5加载并运行程序178
5.3.6fork和exec函数的应用实例180
*5.3.7非本地跳转184
5.3.8进程与程序的区别186
5.4信号机制186
5.4.1信号概念186
5.4.2信号术语188
5.4.3发送信号的过程188
5.4.4接收信号的过程191
*5.4.5信号处理问题193
*5.4.6可移植信号处理197
*5.4.7信号处理引起的竞争198
*5.5守护进程201
5.6进程、内核与系统调用间的
关系203
5.7本章小结204
课后作业205
第6章线程控制与同步互斥211
6.1线程概念211
6.1.1什么是线程211
6.1.2线程执行模型212
6.1.3多线程应用213
6.1.4第一个线程213
6.2多线程并发特征与编程方法215
6.2.1Pthreads线程API215
6.2.2多线程并发特征217
6.2.3线程间数据传递219
6.3多线程程序中的共享变量221
6.3.1进程的用户地址空间结构222
6.3.2变量类型和运行实例223
6.3.3共享变量的识别223
6.4线程同步与互斥224
6.4.1变量共享带来的同步错误224
6.4.2临界资源、临界区、进程(线程)
互斥问题229
6.4.3用信号量与P/V操作保证临界区
互斥执行230
6.4.4用信号量及P/V操作解决资源
调度问题233
6.4.5用Pthreads同步机制实现线程的
互斥与同步237
6.4.6共享变量的类型与同步编程小结242
6.5经典同步问题242
6.5.1生产者/消费者问题243
6.5.2读者/写者问题245
*6.6其他同步机制246
*6.6.1AND型信号量246
*6.6.2信号量集247
*6.6.3条件变量248
*6.6.4管程250
*6.7多线程并发的其他问题251
*6.7.1线程安全251
*6.7.2可重入性253
*6.7.3线程不安全库函数254
*6.7.4线程竞争254
6.8使用多线程提高并行性257
6.8.1顺序程序、并发程序和并行
程序257
6.8.2并行程序应用示例258
6.8.3使用线程管理多个并发活动262
6.9本章小结264
课后作业265
前言/序言
前言
Linux是一种性能稳定的多用户网络操作系统,它与UNIX系统有相似的文件结构、用户接口和操作方式。Linux虽然是开源免费的操作系统,但它继承了UNIX系统强大的功能、卓越的性能和稳定性。学习Linux系统编程不仅能帮助学生更好地巩固和理解操作系统的工作原理,还能培养学生的实践技能。因此,很多高校选择Linux系统作为操作系统原理课程的实例系统,选用Linux系统编程项目作为操作系统原理课程的实验内容。
由于Linux系统编程本身就是一门难度较大、内容繁多的课程,从中选取一些项目来开设操作系统实验,存在以下一些问题:①Linux系统本身涉及很多理论、概念、技术、算法,操作系统这门课一般仅有十多个实验学时,由于学时太少,学生很难较好地掌握Linux系统编程技术,教学效果不佳;②目前很难找到将Linux系统编程技术与操作系统理论很好地融合的教材,结果是学习操作系统理论对学习Linux系统编程帮助不是很大,学习Linux系统编程对理解操作系统的理论帮助作用也非常有限;③一般基于Linux的实验指导或实验教材都写得比较简略,对Linux系统中多进程并发、线程编程、I/O操作的介绍不完整、不系统,也没有补充必要的C语言语法知识,导致学生在学习过程中遇到很多难以克服的困难,丧失学习兴趣和信心。
《Linux编程》内容丰富、结构合理、思路清晰、语言简练流畅、示例翔实。每一章的引言部分概述了该章的作用和内容。在每一章的正文中,结合所讲述的关键技术和难点,穿插了大量极富实用价值的示例,并安排了有针对性的思考和练习,以帮助读者理解相关概念。每一章的末尾都安排了丰富的课后作业,有助于培养读者的分析能力和实际应用能力。
《Linux编程》的目的是培养学生关于计算机系统的知识和能力,对操作系统和Linux系统编程进行整合,以Linux系统编程为主线,并纳入操作系统原理课程中的进程管理、信号量与P/V操作、文件系统等部分内容,将理论和实践有机地融合起来,可作为独立的操作系统实验或Linux系统编程课程开设,通过实践更好地理解课程理论,以提高教学质量。
除封面署名的作者外,参加《Linux编程》编写的人员还有刘文果、李伟、肖捷、谭伟等人。由于作者水平有限,《Linux编程》难免有不足之处,欢迎广大读者批评指正。
作者
2018年7月