《Linux C程式设计王者归来》是2014年清华大学出版社出版的图书,作者是吴岳 。
基本介绍
- 书名:Linux C程式设计王者归来
- 作者:吴岳
- ISBN:9787302355632
- 类别:IT计算机
- 页数:766页
- 定价:99.8元
- 出版社:清华大学出版社
- 出版时间:2014-7-4
- 开本:16开
内容简介
Linux C程式设计王者归来共28章,分6篇。第1篇Linux下C语言基础,介绍了Linux发展、控制结构、C语言中的函式、指针与字元串及C语言高级技术等;第2篇C语言开发环境,介绍了vi编辑器、gcc编译器、构建makefile档案和gdb调试器等;第3篇Linux进程操作,介绍了进程环境、进程控制、时间和日曆历程、信号及信号处理、进程间通信、执行绪和执行绪高级操作等;第4篇Linux档案操作,介绍了档案I/O、档案管理、目录操作、特殊档案和基于流的I/O等;第5篇Linux网路编程,介绍了TCP和UDP协定、网路编程基础、网路编程进阶、实现档案传输程式实例和简单的Web伺服器实例;第6篇介绍了shell脚本基础和脚本中的控制结构等。
本书由浅入深,全面细緻地讲述了Linux环境C程式设计从基本概念到实际操作,从核心原理到具体实践,再到实际案例开发等内容,涵盖了LinuxC程式设计的所有重要知识点。本书讲解时结合大量实例,便于读者通过动手实践更加深刻地理解所学知识。另外,本书配1张DVD光碟,内容为作者专门为本书录製的16.8小时高清配套教学视频、本书涉及的实例源档案及其他相关学习资料。
本书适合所有想全面学习LinuxC开发技术的人员阅读,也适合各种使用LinuxC做开发的工程技术人员阅读。对于长期在Linux平台做开发的程式设计师,本书更是一本不可多得的案头必备参考书。
本书适合所有想全面学习LinuxC开发技术的人员阅读,也适合各种使用LinuxC做开发的工程技术人员阅读。对于长期在Linux平台做开发的程式设计师,本书更是一本不可多得的案头必备参考书。
前 言
Linux系统以其免费、开源等特点,在伺服器解决方案、嵌入式开发和计算机安全等领域的优势已经越来越明显,也越来越被更多的开发人员所认同。在Linux系统下,最为有效的开发方式是採用C语言开发。IT行业的人才招聘也可以印证这一点。很明显,基于Linux系统开发的人员需求量不断增加,尤其对Linux环境C程式设计人员的需求尤为明显。
儘管Linux环境C语言开发越来越被企业和开发人员所认同,而且关注的人数也越来越多,但实际上真正了解和掌握Linux环境C程式设计的人员却是少数,在整个程式设计师队伍中所占比例依然较低。这可能也是由于Linux环境C程式设计对于大多数人来说并不是一件容易的事,开发人员要在陌生的战场(Linux作业系统),使用陌生的武器(gcc和vi等开发工具),和陌生的敌人(要遇到作业系统层面的相关技术)作战。
为了让广大Linux环境C程式设计爱好者和程式设计师更加系统、深入和透彻地学习这门技术,笔者总结了自己亲身学习Linux系统函式接口的经验,并结合了多年从事Linux环境C程式设计的经验,编写了本书。在本书中,笔者将通过28章的学习规划,让读者更快速地掌握Linux环境C程式设计的基本知识和编程技巧。
儘管Linux环境C语言开发越来越被企业和开发人员所认同,而且关注的人数也越来越多,但实际上真正了解和掌握Linux环境C程式设计的人员却是少数,在整个程式设计师队伍中所占比例依然较低。这可能也是由于Linux环境C程式设计对于大多数人来说并不是一件容易的事,开发人员要在陌生的战场(Linux作业系统),使用陌生的武器(gcc和vi等开发工具),和陌生的敌人(要遇到作业系统层面的相关技术)作战。
为了让广大Linux环境C程式设计爱好者和程式设计师更加系统、深入和透彻地学习这门技术,笔者总结了自己亲身学习Linux系统函式接口的经验,并结合了多年从事Linux环境C程式设计的经验,编写了本书。在本书中,笔者将通过28章的学习规划,让读者更快速地掌握Linux环境C程式设计的基本知识和编程技巧。
本书特色
1.技术翔实,内容突出
本书从实际开发者的角度出发,全面、系统、深入地介绍了Linux环境C语言编程方方面面的知识。书中除了涉及Linux系统函式的各个方面外,还选择了当前最热门、套用最广的技术进行了深入的讨论。
2.概念準确,理解深刻
本书对每个核心概念都使用通俗、形象的语言进行解释,对很多关键概念还配有相关插图,让读者更加直观地掌握概念的含义。另外,鑒于广大读者对Windows比较熟悉,本书在多处概念讲解中将Linux和Windows系统开发中的相关概念进行了对比讲解,以加深读者对Linux开发的理解。
3.实例丰富,强调实践
为了让读者易于掌握Linux环境下C语言编程的技巧,本书列举了大量实例进行讲解。通过这些实例,读者可以更加深入地理解相关概念,从而达到灵活使用Linux系统函式接口编写程式的目的。另外,本书重点强调实践性,书中的很多例子都来源于作者的实际开发,大多数实例都是一些实际项目中截取的一部分子功能。通过对这些例子的学习,可以增强读者的动手实践能力。
4.代码规範,注释详细
为了让读者了解Linux环境下开发的要求,本书在讲解代码时十分注意代码规範。书中所有的代码都取自实际开发经验,符合规範。为了帮助读者理解代码含义,书中对代码进行了详细的注释,读者可以通过注释十分便利地了解代码的结构和流程。
5.视频教学,高效直观
笔者专门为本书录製了长达16.8小时的配套高清多媒体教学视频,便于让读者更加轻鬆、直观地学习,从而提高学习效率。这些视频与本书原始码一起收录于配书光碟中。
本书从实际开发者的角度出发,全面、系统、深入地介绍了Linux环境C语言编程方方面面的知识。书中除了涉及Linux系统函式的各个方面外,还选择了当前最热门、套用最广的技术进行了深入的讨论。
2.概念準确,理解深刻
本书对每个核心概念都使用通俗、形象的语言进行解释,对很多关键概念还配有相关插图,让读者更加直观地掌握概念的含义。另外,鑒于广大读者对Windows比较熟悉,本书在多处概念讲解中将Linux和Windows系统开发中的相关概念进行了对比讲解,以加深读者对Linux开发的理解。
3.实例丰富,强调实践
为了让读者易于掌握Linux环境下C语言编程的技巧,本书列举了大量实例进行讲解。通过这些实例,读者可以更加深入地理解相关概念,从而达到灵活使用Linux系统函式接口编写程式的目的。另外,本书重点强调实践性,书中的很多例子都来源于作者的实际开发,大多数实例都是一些实际项目中截取的一部分子功能。通过对这些例子的学习,可以增强读者的动手实践能力。
4.代码规範,注释详细
为了让读者了解Linux环境下开发的要求,本书在讲解代码时十分注意代码规範。书中所有的代码都取自实际开发经验,符合规範。为了帮助读者理解代码含义,书中对代码进行了详细的注释,读者可以通过注释十分便利地了解代码的结构和流程。
5.视频教学,高效直观
笔者专门为本书录製了长达16.8小时的配套高清多媒体教学视频,便于让读者更加轻鬆、直观地学习,从而提高学习效率。这些视频与本书原始码一起收录于配书光碟中。
本书内容
第1篇 Linux下C语言基础(第1~5章)
本篇主要内容包括:Linux简介、控制结构、C语言中的函式、C语言中的指针与字元串及C语言的高级技术。通过本篇的学习,读者可以了解Linux的发展过程,掌握Linux下C语言的基础知识。
第2篇 C语言开发环境(第6~9章)
本篇主要内容包括:vi编辑器、gcc编译器、构建makefile档案及gdb调试器。通过本篇的学习,读者可以掌握Linux下C语言开发环境的使用。
第3篇 Linux进程操作(第10~16章)
本篇主要内容包括:进程环境、进程控制、时间和日曆历程、信号及信号处理、进程间通信、执行绪及执行绪高级操作。通过本篇的学习,读者可以掌握Linux下C语言编程的进程操作技术。
第4篇 Linux档案操作(第17~21章)
本篇主要内容包括:档案I/O、档案管理、目录操作、特殊档案及基于流的I/O。通过本篇的学习,读者可以掌握Linux下C语言的档案操作。
第5篇 Linux网路编程(第22~26章)
本篇主要内容包括:TCP和UDP协定、网路编程基础、网路编程进阶及两个编程实例。通过本篇的学习,读者可以熟练掌握Linux下C语言的网路编程技术。
第6篇 shell脚本知识(第27~28章)
本篇主要内容包括:shell脚本基础和shell脚本中的控制结构。通过本篇的学习,读者可以初步掌握shell脚本的知识。
本篇主要内容包括:Linux简介、控制结构、C语言中的函式、C语言中的指针与字元串及C语言的高级技术。通过本篇的学习,读者可以了解Linux的发展过程,掌握Linux下C语言的基础知识。
第2篇 C语言开发环境(第6~9章)
本篇主要内容包括:vi编辑器、gcc编译器、构建makefile档案及gdb调试器。通过本篇的学习,读者可以掌握Linux下C语言开发环境的使用。
第3篇 Linux进程操作(第10~16章)
本篇主要内容包括:进程环境、进程控制、时间和日曆历程、信号及信号处理、进程间通信、执行绪及执行绪高级操作。通过本篇的学习,读者可以掌握Linux下C语言编程的进程操作技术。
第4篇 Linux档案操作(第17~21章)
本篇主要内容包括:档案I/O、档案管理、目录操作、特殊档案及基于流的I/O。通过本篇的学习,读者可以掌握Linux下C语言的档案操作。
第5篇 Linux网路编程(第22~26章)
本篇主要内容包括:TCP和UDP协定、网路编程基础、网路编程进阶及两个编程实例。通过本篇的学习,读者可以熟练掌握Linux下C语言的网路编程技术。
第6篇 shell脚本知识(第27~28章)
本篇主要内容包括:shell脚本基础和shell脚本中的控制结构。通过本篇的学习,读者可以初步掌握shell脚本的知识。
学习建议
为了提高读者的学习效率,增强学习效果,特别提出以下学习建议。
* 仔细看图:为了帮助读者理解概念,本书中多次使用了图示的方法来讲解概念。请读者认真查看这些示意图,可以更加深刻地理解所讲解的知识点。
* 亲自动手:本书中的所有实例都有实际的开发背景,所以需要读者亲自完成书中的实例,这样才能身临其境地感受到实际项目对开发者的要求。
* 技术交流:Linux本身就是开源的系统,从诞生之日起,就和技术交流密切相关。根据笔者的经验,技术交流和网路资源对开发者而言是至关重要的。希望读者一开始就能注意到技术交流的重要性。
* 坚持编程:程式设计是实践性很强的事,除了要掌握好基本的语法和理论外,还需要长期坚持动手实践,只有这样才能避免“纸上谈兵”,胜任实际的工作要求。
* 仔细看图:为了帮助读者理解概念,本书中多次使用了图示的方法来讲解概念。请读者认真查看这些示意图,可以更加深刻地理解所讲解的知识点。
* 亲自动手:本书中的所有实例都有实际的开发背景,所以需要读者亲自完成书中的实例,这样才能身临其境地感受到实际项目对开发者的要求。
* 技术交流:Linux本身就是开源的系统,从诞生之日起,就和技术交流密切相关。根据笔者的经验,技术交流和网路资源对开发者而言是至关重要的。希望读者一开始就能注意到技术交流的重要性。
* 坚持编程:程式设计是实践性很强的事,除了要掌握好基本的语法和理论外,还需要长期坚持动手实践,只有这样才能避免“纸上谈兵”,胜任实际的工作要求。
本书读者对象
* Linux环境C语言编程的初学者;
* 研究Linux系统函式接口的人员;
* Linux桌面套用开发人员;
* Linux伺服器程式开发人员;
* 嵌入式Linux程式开发人员;
* 在Linux环境下做毕业设计的学生;
* Linux环境C语言编程爱好者;
* 大中专院校和社会培训班的学生;
* 需要一本案头必备手册的程式设计师。
* 研究Linux系统函式接口的人员;
* Linux桌面套用开发人员;
* Linux伺服器程式开发人员;
* 嵌入式Linux程式开发人员;
* 在Linux环境下做毕业设计的学生;
* Linux环境C语言编程爱好者;
* 大中专院校和社会培训班的学生;
* 需要一本案头必备手册的程式设计师。
作者简介
本书由吴岳主笔编写。其他参与编写的人员有梁胜斌、林阳、林珍珍、刘爱军、刘海峰、罗明英、马奎林、乔建军、施迎、石小勇、宋晓薇、苏亚光、谭东平、王守信、王向军、王晓东、王晓倩、王晓艳、魏来科、吴俊、闫芳、杨丹、杨艳、宜亮、余柏山、张春杰、张春晓、张娜、赵东、钟晓鸣、朱翠红、朱萍玉、龚力、黄茂发、邢岩、符滔滔。
希望各位读者通过阅读本书,能很好地掌握Linux环境C语言开发技术,成为这个领域中的“王者”,笔者将倍感欣慰!所学授之于人,不亦乐乎?最后祝读书快乐!
编者
希望各位读者通过阅读本书,能很好地掌握Linux环境C语言开发技术,成为这个领域中的“王者”,笔者将倍感欣慰!所学授之于人,不亦乐乎?最后祝读书快乐!
编者
目 录
第1篇 Linux下C语言基础
第1章 Linux简介( 教学视频:16分钟)2
1.1 GNU简介2
1.2 Linux简介2
1.2.1 Linux 发展史2
1.2.2 Linux发行版4
1.2.3 Linux核心版本5
1.2.4 Linux与UNIX的关係5
1.2.5 Linux在伺服器方面的发展5
1.2.6 Linux在嵌入式系统方面的发展6
1.2.7 Linux在桌面系统方面的发展6
1.3 Linux 环境下的其他程式语言7
1.3.1 C++7
1.3.2 Java9
1.3.3 Perl11
1.3.4 Python12
1.3.5 Ruby13
1.3.6 PHP13
第2章 控制结构( 教学视频:56分钟)16
2.1 goto语句16
2.1.1 C语言中的无条件跳转16
2.1.2 使用goto语句进行出错处理17
2.1.3 出错处理的一般模型19
2.2 C语言中的分支结构20
2.2.1 分支结构的翻译20
2.2.2 使用goto语句实现分支结构22
2.3 短路计算22
2.3.1 短路计算22
2.3.2 &&运算的短路计算23
2.3.3 ||运算的短路计算24
2.4 C语言中的循环结构26
2.4.1 while循环26
2.4.2 do…while循环28
2.4.3 for循环30
2.5 switch语句32
2.5.1 switch语句的套用32
2.5.2 使用goto语句实现switch语句33
2.6 最佳化控制结构34
2.6.1 表达式最佳化——使用替换程式中的乘除法34
2.6.2 表达式最佳化——常量摺叠35
2.6.3 表达式最佳化——使用数学公式36
2.6.4 表达式最佳化——存储问题37
2.6.5 分支最佳化——改变判断顺序38
2.6.6 分支最佳化——使用switch语句41
2.6.7 循环最佳化——一次性计算42
第3章 C语言中的函式( 教学视频:56分钟)46
3.1 函式的本质46
3.2 变数的作用域和生命期47
3.2.1 全局变数47
3.2.2 局部变数48
3.3 变数的初始值50
3.3.1 全局变数的初始值50
3.3.2 局部变数的初始值50
3.4 与函式有关的最佳化51
3.4.1 函式调用与程式最佳化52
3.4.2 变数存储最佳化54
3.5 编写多档案程式——变数的存储类别56
3.5.1 存储类别56
3.5.2 static变数的作用——改变变数的生命期56
3.5.3 static变数的作用——实现封装和模组化设计58
3.6 编写多档案的程式——连结的作用61
3.6.1 连结多个档案61
3.6.2 连结时符号解析规则63
3.6.3 连结规则的套用63
3.7 可变参数66
3.7.1 可变参数的概念66
3.7.2 实现一个简单的可变参数的函式67
3.7.3 可变参数实例69
3.7.4 关于printf()函式的疑问——缺少整型参数74
3.7.5 关于printf()函式的疑问——缺少字元串地址参数75
第4章 C语言中的指针与字元串( 教学视频:48分钟)78
4.1 sizeof运算符78
4.1.1 sizeof运算符的套用——得到内置类型的大小78
4.1.2 sizeof运算符的套用——得到複合类型的大小79
4.2 指针的套用80
4.2.1 指针与别名陷阱80
4.2.2 数组的指针82
4.2.3 指针的指针83
4.2.4 指针与参数传递85
4.2.5 指针类型的意义90
4.2.6 void*型指针91
4.3 函式的指针94
4.3.1 C语言中的函式指针94
4.3.2 函式指针的套用——回调函式97
4.3.3 函式指针数组102
4.4 字元串103
4.4.1 字元串与字元数组103
4.4.2 字元串与指针104
4.4.3 限定修饰符const106
4.4.4 const关键字修饰指针——在指针定义之前107
4.4.5 const关键字修饰指针——在指针定义之中107
4.4.6 const关键字修饰指针——在指针定义之前和定义之中107
4.4.7 使用const关键字的意义108
第5章 C语言的高级技术( 教学视频:30分钟)111
5.1 结构体与共同体111
5.1.1 结构体中成员变数的存储分布111
5.1.2 记忆体对齐112
5.2 位运算115
5.2.1 掩码运算115
5.2.2 不安全的位运算117
5.2.3 异或运算的特性119
5.2.4 移位运算的陷阱121
5.2.5 移位运算的实例122
5.3 预处理124
5.3.1 常用的代码组织形式124
5.3.2 调试开关129
5.4 C99新标準关键字详解130
5.4.1 inline关键字的概念131
5.4.2 inline关键字实例131
5.4.3 inline关键字使用总结132
5.4.4 restrict关键字的概念133
5.4.5 restrict关键字的套用134
第2篇 C语言开发环境
第6章 vi编辑器( 教学视频:44分钟)136
6.1 vi编辑器入门136
6.1.1 vi简介136
6.1.2 vi的工作模式136
6.2 vi一般操作137
6.2.1 进入vi137
6.2.2 文本插入操作140
6.2.3 文本删除操作141
6.2.4 文本複製操作143
6.2.5 撤销命令144
6.2.6 重複命令145
6.2.7 退出vi145
6.3 vi的增强操作147
6.3.1 替换命令147
6.3.2 游标移动148
6.3.3 按行移动游标148
6.3.4 按字移动游标149
6.3.5 按句移动游标150
6.3.6 按段移动游标151
6.3.7 文本行的移动151
6.3.8 文本的异行移动153
6.3.9 萤幕滚动153
6.3.10 查找命令154
6.3.11 替换命令155
6.3.12 视窗的切分157
6.3.13 设定环境157
第7章 gcc编译器( 教学视频:27分钟)159
7.1 初探gcc编译器159
7.1.1 从经典的hello world开始159
7.1.2 gcc编译流程160
7.2 gcc常用选项160
7.2.1 gcc常用选项汇总161
7.2.2 -c选项161
7.2.3 -S选项162
7.2.4 -E选项163
7.2.5 -o选项164
7.2.6 -I选项165
7.2.7 -g选项165
7.3 连结原理165
7.3.1 连结器的任务165
7.3.2 目标档案165
7.3.3 ELF格式的可重定位目标档案167
7.3.4 目标档案中的符号表168
7.3.5 重定位的概念172
7.3.6 符号的重定位信息172
7.4 关于库173
7.4.1 使用库的优势173
7.4.2 静态库的概念175
7.4.3 创建静态库175
7.4.4 使用静态库176
7.4.5 动态库的概念177
7.4.6 创建动态库178
7.4.7 使用动态库180
7.5 gcc工具链181
第8章 构建makefile档案( 教学视频:46分钟)183
8.1 makefile档案入门183
8.1.1 makefile档案的组成内容183
8.1.2 makefile档案包含183
8.1.3 make工具的退出码184
8.2 书写makefile规则185
8.2.1 使用基本规则185
8.2.2 使用隐式规则186
8.2.3 使用伪目标187
8.2.4 使用通配符188
8.2.5 搜寻源档案189
8.3 使用命令190
8.3.1 显示命令190
8.3.2 执行命令190
8.3.3 命令出错192
8.4 使用变数192
8.4.1 使用普通变数192
8.4.2 变数中的变数194
8.4.3 追加变数的值196
8.4.4 自动化变数197
8.5 使用条件判断197
8.5.1 条件表达式197
8.5.2 表达式实例199
8.6 使用函式200
8.6.1 函式调用的语法200
8.6.2 字元串处理函式201
8.6.3 档案名称操作函式206
8.6.4 foreach 函式209
8.6.5 if函式210
8.6.6 call函式210
8.6.7 origin函式211
8.6.8 shell函式211
8.7 makefile实例212
8.7.1 makefile实例——项目中的总makefile212
8.7.2 makefile实例——makefile模板214
第9章 gdb调试器( 教学视频:27分钟)216
9.1 列出源程式216
9.1.1 不带参数的list命令216
9.1.2 带一个参数的list命令217
9.1.3 带两个参数的list命令217
9.2 运行程式的命令218
9.3 操作断点的命令220
9.3.1 设定断点220
9.3.2 显示当前gdb的断点信息222
9.3.3 删除指定的断点223
9.3.4 禁止或启用断点223
9.3.5 清除断点223
9.3.6 观察点224
9.3.7 设定断点实例225
9.4 查看运行时数据228
9.4.1 数据观察命令229
9.4.2 对程式中函式的调用230
9.4.3 查看錶达式的值231
9.4.4 查看数组的值231
9.4.5 变数的输出格式232
9.4.6 查看记忆体233
9.4.7 自动显示变数233
9.4.8 设定显示选项237
9.4.9 显示变数的历史记录239
9.4.10 查看暂存器239
9.4.11 查看使用gdb环境变数240
9.4.12 查看数据实例241
9.5 改变程式的执行245
9.5.1 修改变数的值246
9.5.2 跳转执行246
9.5.3 信号的产生及处理248
9.5.4 强制调用函式248
9.5.5 强制函式返回249
9.6 gdb高级套用249
9.6.1 产生core档案250
9.6.2 跟蹤栈上数据250
9.6.3 绑定运行进程252
9.6.4 源档案搜寻254
9.6.5 机器语言工具254
9.6.6 其他有用的调试命令255
第3篇 Linux进程操作
第10章 进程环境( 教学视频:44分钟)258
10.1 程式的启动和退出258
10.1.1 在shell中启动一个程式258
10.1.2 载入一个程式259
10.1.3 载入地址260
10.1.4 退出程式261
10.1.5 进程终止处理函式262
10.2 Linux进程记忆体管理263
10.2.1 数据的内部存储263
10.2.2 C程式的存储布局——代码段265
10.2.3 C程式的存储布局——数据段和缓冲段267
10.2.4 C程式的存储布局——栈268
10.2.5 C程式的存储布局——堆269
10.2.6 常量的存储270
10.2.7 动态记忆体管理271
10.2.8 动态记忆体分配的深入研究273
10.3 shell环境276
10.3.1 命令行参数277
10.3.2 得到程式档案名称278
10.3.3 环境变数278
10.3.4 得到指定的环境变数280
10.3.5 设定一个环境变数280
10.3.6 得到进程结束状态285
10.3.7 使用errno调试程式286
10.3.8 输出错误原因288
10.4 全局跳转289
10.4.1 局部跳转的局限性289
10.4.2 使用全局跳转291
10.4.3 使用全局跳转代替局部跳转292
第11章 进程控制( 教学视频:45分钟)295
11.1 进程标识符295
11.1.1 进程ID295
11.1.2 进程中重要的ID值296
11.2 进程操作297
11.2.1 创建一个进程298
11.2.2 父子进程的共享资源299
11.2.3 fork()函式的出错情况302
11.2.4 创建一个共享空间的子进程303
11.2.5 在函式内部调用vfork()函式304
11.2.6 退出进程305
11.2.7 使用exit()函式检查进程出错信息306
11.2.8 exit()函式与核心函式的关係307
11.2.9 设定进程所有者307
11.2.10 调试多进程——设定跟蹤流309
11.2.11 调试多进程——使用gdb的attach命令309
11.3 执行程式310
11.3.1 执行一个新程式310
11.3.2 执行解释器档案313
11.3.3 在程式中执行shell命令315
11.3.4 实现system()函式317
11.4 关係操作318
11.4.1 等待进程退出318
11.4.2 等待指定的进程321
11.4.3 殭尸进程的概念323
11.4.4 产生一个殭尸进程324
11.4.5 避免殭尸进程的产生325
11.4.6 输出进程统计信息327
第12章 时间和日曆历程( 教学视频:7分钟)330
12.1 系统时间330
12.2 日曆时间332
第13章 信号及信号处理( 教学视频:48分钟)335
13.1 信号的基础335
13.1.1 信号的基本概念335
13.1.2 产生信号336
13.1.3 处理信号336
13.1.4 常用信号的使用方法337
13.2 信号的影响338
13.2.1 重入339
13.2.2 原子操作341
13.2.3 中断系统调用343
13.3 信号处理函式343
13.3.1 设定信号处理函式343
13.3.2 传送信号347
13.3.3 向进程本身传送信号348
13.3.4 设定Linux定时器349
13.3.5 定时等待I/O350
13.3.6 挂起进程352
13.3.7 进程休眠353
13.4 信号集与禁止信号356
13.4.1 信号集和信号集处理函式356
13.4.2 禁止信号358
13.4.3 处理未决信号360
13.4.4 高级信号注册函式362
13.4.5 信号选项实例——SA_NOCLDWAIT选项363
13.4.6 信号选项实例——SA_NODEFER选项364
13.4.7 信号选项实例——SA_RESETHAND选项366
第14章 进程间通信( 教学视频:52分钟)368
14.1 进程间通信概述368
14.1.1 进程间通信简介368
14.1.2 进程间通信的难点369
14.1.3 IPC的多种方式369
14.2 管道370
14.2.1 管道的概念370
14.2.2 匿名半双工管道370
14.2.3 匿名半双工管道的读写操作371
14.2.4 创建管道的标準库函式375
14.3 FIFO管道377
14.3.1 FIFO的概念377
14.3.2 创建FIFO378
14.3.3 FIFO的读写操作379
14.3.4 FIFO的缺点382
14.4 System V IPC/POSIX IPC383
14.4.1 IPC对象的概念383
14.4.2 IPC对象的问题385
14.4.3 IPC对象系统命令385
14.5 共享记忆体386
14.5.1 共享记忆体的概念386
14.5.2 共享记忆体的创建387
14.5.3 共享记忆体的操作388
14.5.4 共享记忆体使用注意事项390
14.6 信号量391
14.6.1 信号量的概念391
14.6.2 信号量的创建392
14.6.3 信号量集的操作394
14.7 讯息伫列396
14.7.1 讯息伫列的概念396
14.7.2 创建讯息伫列397
14.7.3 读写讯息伫列399
第15章 执行绪( 教学视频:34分钟)403
15.1 执行绪与进程403
15.1.1 执行绪的概念403
15.1.2 执行绪的优势404
15.2 执行绪标识符405
15.3 执行绪基本操作405
15.3.1 创建执行绪405
15.3.2 向执行绪体函式传递参数407
15.3.3 执行绪访问资源的限制409
15.3.4 终止执行绪412
15.3.5 正确得到执行绪退出信息的方法415
15.3.6 取消一个执行绪的运行417
15.3.7 执行绪退出函式420
第16章 执行绪高级操作( 教学视频:28分钟)423
16.1 执行绪同步——使用互斥量423
16.1.1 初始化与销毁互斥量423
16.1.2 得到与释放互斥量424
16.1.3 使用互斥量的实例425
16.2 执行绪同步——使用读写锁430
16.2.1 初始化与销毁读写锁430
16.2.2 得到与释放互斥锁431
16.2.3 使用互斥量与读写锁的比较432
16.3 执行绪属性438
16.3.1 创建和销毁属性结构438
16.3.2 执行绪的分离状态439
16.3.3 分离一个已经创建的执行绪440
16.3.4 执行绪栈的属性442
第4篇 Linux档案操作
第17章 档案I/O( 教学视频:71分钟)446
17.1 档案描述符的概念446
17.2 档案I/O操作446
17.2.1 打开一个档案446
17.2.2 打开档案的出错情况450
17.2.3 关闭一个档案450
17.2.4 创建一个新档案451
17.2.5 档案定位453
17.2.6 档案截短455
17.2.7 清空一个档案458
17.2.8 档案的读写操作460
17.2.9 档案同步463
17.3 档案描述符操作465
17.3.1 複製档案描述符465
17.3.2 I/O重定向概念及其套用466
17.3.3 控制档案469
17.3.4 修改打开档案的档案状态470
17.4 非阻塞档案I/O473
17.4.1 非阻塞I/O的概念473
17.4.2 以非阻塞方式打开档案474
17.4.3 将一个打开档案设定为非阻塞方式475
17.5 记忆体映射I/O477
17.5.1 记忆体映射I/O的概念477
17.5.2 创建一个记忆体映射478
17.5.3 撤销一个记忆体映射480
17.5.4 记忆体映射同步482
17.5.5 更改记忆体映射的许可权485
第18章 档案管理( 教学视频:42分钟)487
18.1 档案状态487
18.2 档案类型488
18.3 档案许可权490
18.3.1 访问许可权491
18.3.2 设定用户ID位和设定组ID位492
18.3.3 设定用户ID位的作用493
18.3.4 使用设定用户ID位的实例494
18.4 档案许可权操作496
18.4.1 测试档案访问许可权497
18.4.2 设定用户ID位与档案许可权测试499
18.4.3 使用档案许可权禁止字499
18.4.4 在shell中使用档案许可权禁止字500
18.4.5 在程式中使用档案许可权禁止字501
18.4.6 改变档案访问许可权502
18.4.7 在shell中改变档案许可权503
18.4.8 在程式中改变档案许可权504
18.4.9 改变一个打开的档案许可权505
18.5 档案系统结构509
18.6 档案的硬连结513
18.6.1 创建一个硬连结513
18.6.2 删除一个硬连结515
18.7 改变档案所有者519
18.8 操作档案的时间522
第19章 目录操作( 教学视频:30分钟)526
19.1 目录的许可权526
19.1.1 目录的访问许可权526
19.1.2 测试目录的访问许可权527
19.2 目录操作528
19.2.1 创建一个目录528
19.2.2 删除一个目录529
19.2.3 目录项结构530
19.2.4 打开与关闭目录531
19.2.5 读目录531
19.2.6 读目录操作的实例——实现自己的ls命令534
19.2.7 得到目录档案的读写位置536
19.2.8 定位目录537
19.2.9 回卷目录档案539
19.3 进程的工作目录540
19.3.1 工作目录的概念540
19.3.2 改变进程的工作目录541
19.3.3 得到进程的当前工作目录542
19.3.4 子进程工作目录对父进程的影响545
第20章 特殊档案( 教学视频:32分钟)548
20.1 符号连结操作548
20.1.1 符号连结548
20.1.2 符号连结的功能549
20.1.3 创建符号连结549
20.1.4 创建指向不存在档案的符号连结550
20.1.5 读写符号连结的目的档案551
20.1.6 读写多重符号连结的目的档案553
20.1.7 读写符号连结555
20.1.8 取得符号连结的状态558
20.1.9 更改符号连结的所有者562
20.2 proc档案系统566
20.2.1 proc档案系统566
20.2.2 常用的核心信息567
20.2.3 读取核心信息568
20.2.4 进程状态信息575
20.2.5 读取进程状态576
20.2.6 proc档案系统编程实例——实现自己的ps命令578
第21章 基于流的I/O( 教学视频:30分钟)581
21.1 流与缓冲581
21.2 基于流的档案操作583
21.2.1 打开和关闭流583
21.2.2 档案内容的沖洗585
21.2.3 以字元为单位读写数据587
21.2.4 以行为单位读写数据588
21.2.5 gets()函式的漏洞589
21.2.6 逐行读取档案内容590
21.2.7 输出XML形式的配置档案591
21.2.8 读写数据块593
21.2.9 档案读写实例——实现cp命令594
21.2.10 档案读写实例——字元统计596
21.2.11 档案读写实例——目录下所有档案的字元统计597
第5篇 Linux网路编程
第22章 TCP和UDP协定( 教学视频:22分钟)602
22.1 计算机网路的体系结构简介602
22.1.1 计算机网路体系结构简介602
22.1.2 OSI 参考模型中各层功能描述603
22.1.3 TCP/IP参考模型的各层功能描述603
22.1.4 面向连线服务和无连线服务604
22.2 客户/伺服器方式简介604
22.3 用户数据报协定UDP605
22.3.1 用户数据报的格式605
22.3.2 用户数据报检验和的计算606
22.3.3 UDP用户数据报的特性及用途607
22.4 传输控制协定 TCP608
22.4.1 TCP简介608
22.4.2 TCP报文段的首部608
22.4.3 TCP数据编号与确认609
22.4.4 TCP的流量控制与拥塞控制610
22.4.5 TCP的运输连线管理612
第23章 网路编程基础( 教学视频:50分钟)614
23.1 套接字概念614
23.2 準备工作615
23.2.1 位元组序615
23.2.2 地址格式616
23.2.3 地址形式转换617
23.2.4 获得主机信息619
23.2.5 地址映射620
23.3 套接字基础编程621
23.3.1 建立和销毁套接字描述符621
23.3.2 地址绑定623
23.3.3 建立一个连线624
23.3.4 最简单的网路应用程式——伺服器端626
23.3.5 最简单的网路应用程式——客户端629
23.3.6 使用档案读写函式读写套接字631
23.3.7 使用完整读写函式的网路应用程式634
23.3.8 面向连线的数据传输637
23.3.9 面向连线的网路应用程式——伺服器端638
23.3.10 面向连线的网路应用程式——客户端641
23.3.11 无连线的数据传输643
23.3.12 无连线的网路应用程式——伺服器端644
23.3.13 无连线的网路应用程式——客户端646
23.4 非阻塞套接字649
23.4.1 非阻塞网路应用程式——伺服器端649
23.4.2 非阻塞网路应用程式——客户端651
第24章 网路编程进阶( 教学视频:32分钟)654
24.1 套接字编程深入654
24.1.1 bind函式的作用654
24.1.2 并发伺服器655
24.1.3 UDP协定的connect()函式套用657
24.2 多路选择I/O660
24.2.1 多路选择I/O的概念660
24.2.2 实现多路选择I/O661
24.2.3 使用多路选择I/O处理多个连线663
24.2.4 禁止信号的多路选择I/O666
24.2.5 对比select()函式和pselect()函式667
24.2.6 轮询I/O669
24.3 非网路通信套接字670
24.3.1 非命名UNIX域套接字671
24.3.2 命名UNIX域套接字672
24.3.3 UNIX域套接字实例——伺服器端673
24.3.4 UNIX域套接字实例——客户端677
第25章 网路编程实例——实现档案传输程式( 教学视频:18分钟)679
25.1 程式设计679
25.1.1 整体程式设计679
25.1.2 客户端程式设计679
25.1.3 伺服器端程式设计680
25.2 档案传输程式的实现683
25.2.1 客户端程式的实现——头档案683
25.2.2 客户端程式的实现——程式主函式684
25.2.3 客户端程式的实现——命令拆分函式686
25.2.4 客户端程式的实现——命令处理模组687
25.2.5 伺服器端程式的实现——头档案697
25.2.6 伺服器端程式的实现——程式主函式698
25.2.7 伺服器端程式的实现——客户端命令处理模组699
25.3 测试和验证706
第26章 网路编程实例——简单的Web伺服器( 教学视频:10分钟)707
26.1 程式设计707
26.1.1 整体程式设计707
26.1.2 步骤1——解析客户端传送的内容708
26.1.3 步骤2——寻找客户端需要的档案709
26.1.4 步骤3——将客户端信息返回709
26.2 Web伺服器的实现710
26.2.1 Web伺服器程式的实现——头档案710
26.2.2 Web伺服器程式的实现——程式主函式711
26.2.3 Web伺服器程式的实现——请求处理模组715
26.3 测试和验证719
第6篇 shell脚本知识
第27章 shell脚本基础( 教学视频:32分钟)722
27.1 编写最简单的shell脚本722
27.1.1 使用shell脚本的原因722
27.1.2 脚本内容723
27.1.3 运行一段脚本724
27.2 shell中的变数724
27.2.1 用户自定义变数725
27.2.2 引用变数726
27.2.3 为表达式求值727
27.2.4 变数的类型729
27.2.5 操作自定义变数730
27.2.6 位置变数731
27.2.7 重新分配位置变数732
27.3 退出状态734
27.4 条件测试736
27.4.1 测试档案状态736
27.4.2 测试时使用逻辑操作符738
27.4.3 字元串测试739
27.4.4 测试数值741
第28章 shell脚本中的控制结构( 教学视频:29分钟)743
28.1 shell脚本中的命令替换743
28.2 分支结构744
28.2.1 if/else分支结构744
28.2.2 多重分支结构745
28.2.3 使用case结构的分支语句747
28.2.4 在case语句中使用逻辑表达式749
28.3 条件测试命令的值750
28.3.1 测试整数与字元串751
28.3.2 测试字元串和空值752
28.3.3 测试未初始化的变数752
28.3.4 测试“false”的值753
28.4 循环结构754
28.4.1 while循环结构754
28.4.2 until循环结构757
28.4.3 for循环结构759
28.4.4 break和continue命令762
28.5 定义函式和使用函式764
第1章 Linux简介( 教学视频:16分钟)2
1.1 GNU简介2
1.2 Linux简介2
1.2.1 Linux 发展史2
1.2.2 Linux发行版4
1.2.3 Linux核心版本5
1.2.4 Linux与UNIX的关係5
1.2.5 Linux在伺服器方面的发展5
1.2.6 Linux在嵌入式系统方面的发展6
1.2.7 Linux在桌面系统方面的发展6
1.3 Linux 环境下的其他程式语言7
1.3.1 C++7
1.3.2 Java9
1.3.3 Perl11
1.3.4 Python12
1.3.5 Ruby13
1.3.6 PHP13
第2章 控制结构( 教学视频:56分钟)16
2.1 goto语句16
2.1.1 C语言中的无条件跳转16
2.1.2 使用goto语句进行出错处理17
2.1.3 出错处理的一般模型19
2.2 C语言中的分支结构20
2.2.1 分支结构的翻译20
2.2.2 使用goto语句实现分支结构22
2.3 短路计算22
2.3.1 短路计算22
2.3.2 &&运算的短路计算23
2.3.3 ||运算的短路计算24
2.4 C语言中的循环结构26
2.4.1 while循环26
2.4.2 do…while循环28
2.4.3 for循环30
2.5 switch语句32
2.5.1 switch语句的套用32
2.5.2 使用goto语句实现switch语句33
2.6 最佳化控制结构34
2.6.1 表达式最佳化——使用替换程式中的乘除法34
2.6.2 表达式最佳化——常量摺叠35
2.6.3 表达式最佳化——使用数学公式36
2.6.4 表达式最佳化——存储问题37
2.6.5 分支最佳化——改变判断顺序38
2.6.6 分支最佳化——使用switch语句41
2.6.7 循环最佳化——一次性计算42
第3章 C语言中的函式( 教学视频:56分钟)46
3.1 函式的本质46
3.2 变数的作用域和生命期47
3.2.1 全局变数47
3.2.2 局部变数48
3.3 变数的初始值50
3.3.1 全局变数的初始值50
3.3.2 局部变数的初始值50
3.4 与函式有关的最佳化51
3.4.1 函式调用与程式最佳化52
3.4.2 变数存储最佳化54
3.5 编写多档案程式——变数的存储类别56
3.5.1 存储类别56
3.5.2 static变数的作用——改变变数的生命期56
3.5.3 static变数的作用——实现封装和模组化设计58
3.6 编写多档案的程式——连结的作用61
3.6.1 连结多个档案61
3.6.2 连结时符号解析规则63
3.6.3 连结规则的套用63
3.7 可变参数66
3.7.1 可变参数的概念66
3.7.2 实现一个简单的可变参数的函式67
3.7.3 可变参数实例69
3.7.4 关于printf()函式的疑问——缺少整型参数74
3.7.5 关于printf()函式的疑问——缺少字元串地址参数75
第4章 C语言中的指针与字元串( 教学视频:48分钟)78
4.1 sizeof运算符78
4.1.1 sizeof运算符的套用——得到内置类型的大小78
4.1.2 sizeof运算符的套用——得到複合类型的大小79
4.2 指针的套用80
4.2.1 指针与别名陷阱80
4.2.2 数组的指针82
4.2.3 指针的指针83
4.2.4 指针与参数传递85
4.2.5 指针类型的意义90
4.2.6 void*型指针91
4.3 函式的指针94
4.3.1 C语言中的函式指针94
4.3.2 函式指针的套用——回调函式97
4.3.3 函式指针数组102
4.4 字元串103
4.4.1 字元串与字元数组103
4.4.2 字元串与指针104
4.4.3 限定修饰符const106
4.4.4 const关键字修饰指针——在指针定义之前107
4.4.5 const关键字修饰指针——在指针定义之中107
4.4.6 const关键字修饰指针——在指针定义之前和定义之中107
4.4.7 使用const关键字的意义108
第5章 C语言的高级技术( 教学视频:30分钟)111
5.1 结构体与共同体111
5.1.1 结构体中成员变数的存储分布111
5.1.2 记忆体对齐112
5.2 位运算115
5.2.1 掩码运算115
5.2.2 不安全的位运算117
5.2.3 异或运算的特性119
5.2.4 移位运算的陷阱121
5.2.5 移位运算的实例122
5.3 预处理124
5.3.1 常用的代码组织形式124
5.3.2 调试开关129
5.4 C99新标準关键字详解130
5.4.1 inline关键字的概念131
5.4.2 inline关键字实例131
5.4.3 inline关键字使用总结132
5.4.4 restrict关键字的概念133
5.4.5 restrict关键字的套用134
第2篇 C语言开发环境
第6章 vi编辑器( 教学视频:44分钟)136
6.1 vi编辑器入门136
6.1.1 vi简介136
6.1.2 vi的工作模式136
6.2 vi一般操作137
6.2.1 进入vi137
6.2.2 文本插入操作140
6.2.3 文本删除操作141
6.2.4 文本複製操作143
6.2.5 撤销命令144
6.2.6 重複命令145
6.2.7 退出vi145
6.3 vi的增强操作147
6.3.1 替换命令147
6.3.2 游标移动148
6.3.3 按行移动游标148
6.3.4 按字移动游标149
6.3.5 按句移动游标150
6.3.6 按段移动游标151
6.3.7 文本行的移动151
6.3.8 文本的异行移动153
6.3.9 萤幕滚动153
6.3.10 查找命令154
6.3.11 替换命令155
6.3.12 视窗的切分157
6.3.13 设定环境157
第7章 gcc编译器( 教学视频:27分钟)159
7.1 初探gcc编译器159
7.1.1 从经典的hello world开始159
7.1.2 gcc编译流程160
7.2 gcc常用选项160
7.2.1 gcc常用选项汇总161
7.2.2 -c选项161
7.2.3 -S选项162
7.2.4 -E选项163
7.2.5 -o选项164
7.2.6 -I选项165
7.2.7 -g选项165
7.3 连结原理165
7.3.1 连结器的任务165
7.3.2 目标档案165
7.3.3 ELF格式的可重定位目标档案167
7.3.4 目标档案中的符号表168
7.3.5 重定位的概念172
7.3.6 符号的重定位信息172
7.4 关于库173
7.4.1 使用库的优势173
7.4.2 静态库的概念175
7.4.3 创建静态库175
7.4.4 使用静态库176
7.4.5 动态库的概念177
7.4.6 创建动态库178
7.4.7 使用动态库180
7.5 gcc工具链181
第8章 构建makefile档案( 教学视频:46分钟)183
8.1 makefile档案入门183
8.1.1 makefile档案的组成内容183
8.1.2 makefile档案包含183
8.1.3 make工具的退出码184
8.2 书写makefile规则185
8.2.1 使用基本规则185
8.2.2 使用隐式规则186
8.2.3 使用伪目标187
8.2.4 使用通配符188
8.2.5 搜寻源档案189
8.3 使用命令190
8.3.1 显示命令190
8.3.2 执行命令190
8.3.3 命令出错192
8.4 使用变数192
8.4.1 使用普通变数192
8.4.2 变数中的变数194
8.4.3 追加变数的值196
8.4.4 自动化变数197
8.5 使用条件判断197
8.5.1 条件表达式197
8.5.2 表达式实例199
8.6 使用函式200
8.6.1 函式调用的语法200
8.6.2 字元串处理函式201
8.6.3 档案名称操作函式206
8.6.4 foreach 函式209
8.6.5 if函式210
8.6.6 call函式210
8.6.7 origin函式211
8.6.8 shell函式211
8.7 makefile实例212
8.7.1 makefile实例——项目中的总makefile212
8.7.2 makefile实例——makefile模板214
第9章 gdb调试器( 教学视频:27分钟)216
9.1 列出源程式216
9.1.1 不带参数的list命令216
9.1.2 带一个参数的list命令217
9.1.3 带两个参数的list命令217
9.2 运行程式的命令218
9.3 操作断点的命令220
9.3.1 设定断点220
9.3.2 显示当前gdb的断点信息222
9.3.3 删除指定的断点223
9.3.4 禁止或启用断点223
9.3.5 清除断点223
9.3.6 观察点224
9.3.7 设定断点实例225
9.4 查看运行时数据228
9.4.1 数据观察命令229
9.4.2 对程式中函式的调用230
9.4.3 查看錶达式的值231
9.4.4 查看数组的值231
9.4.5 变数的输出格式232
9.4.6 查看记忆体233
9.4.7 自动显示变数233
9.4.8 设定显示选项237
9.4.9 显示变数的历史记录239
9.4.10 查看暂存器239
9.4.11 查看使用gdb环境变数240
9.4.12 查看数据实例241
9.5 改变程式的执行245
9.5.1 修改变数的值246
9.5.2 跳转执行246
9.5.3 信号的产生及处理248
9.5.4 强制调用函式248
9.5.5 强制函式返回249
9.6 gdb高级套用249
9.6.1 产生core档案250
9.6.2 跟蹤栈上数据250
9.6.3 绑定运行进程252
9.6.4 源档案搜寻254
9.6.5 机器语言工具254
9.6.6 其他有用的调试命令255
第3篇 Linux进程操作
第10章 进程环境( 教学视频:44分钟)258
10.1 程式的启动和退出258
10.1.1 在shell中启动一个程式258
10.1.2 载入一个程式259
10.1.3 载入地址260
10.1.4 退出程式261
10.1.5 进程终止处理函式262
10.2 Linux进程记忆体管理263
10.2.1 数据的内部存储263
10.2.2 C程式的存储布局——代码段265
10.2.3 C程式的存储布局——数据段和缓冲段267
10.2.4 C程式的存储布局——栈268
10.2.5 C程式的存储布局——堆269
10.2.6 常量的存储270
10.2.7 动态记忆体管理271
10.2.8 动态记忆体分配的深入研究273
10.3 shell环境276
10.3.1 命令行参数277
10.3.2 得到程式档案名称278
10.3.3 环境变数278
10.3.4 得到指定的环境变数280
10.3.5 设定一个环境变数280
10.3.6 得到进程结束状态285
10.3.7 使用errno调试程式286
10.3.8 输出错误原因288
10.4 全局跳转289
10.4.1 局部跳转的局限性289
10.4.2 使用全局跳转291
10.4.3 使用全局跳转代替局部跳转292
第11章 进程控制( 教学视频:45分钟)295
11.1 进程标识符295
11.1.1 进程ID295
11.1.2 进程中重要的ID值296
11.2 进程操作297
11.2.1 创建一个进程298
11.2.2 父子进程的共享资源299
11.2.3 fork()函式的出错情况302
11.2.4 创建一个共享空间的子进程303
11.2.5 在函式内部调用vfork()函式304
11.2.6 退出进程305
11.2.7 使用exit()函式检查进程出错信息306
11.2.8 exit()函式与核心函式的关係307
11.2.9 设定进程所有者307
11.2.10 调试多进程——设定跟蹤流309
11.2.11 调试多进程——使用gdb的attach命令309
11.3 执行程式310
11.3.1 执行一个新程式310
11.3.2 执行解释器档案313
11.3.3 在程式中执行shell命令315
11.3.4 实现system()函式317
11.4 关係操作318
11.4.1 等待进程退出318
11.4.2 等待指定的进程321
11.4.3 殭尸进程的概念323
11.4.4 产生一个殭尸进程324
11.4.5 避免殭尸进程的产生325
11.4.6 输出进程统计信息327
第12章 时间和日曆历程( 教学视频:7分钟)330
12.1 系统时间330
12.2 日曆时间332
第13章 信号及信号处理( 教学视频:48分钟)335
13.1 信号的基础335
13.1.1 信号的基本概念335
13.1.2 产生信号336
13.1.3 处理信号336
13.1.4 常用信号的使用方法337
13.2 信号的影响338
13.2.1 重入339
13.2.2 原子操作341
13.2.3 中断系统调用343
13.3 信号处理函式343
13.3.1 设定信号处理函式343
13.3.2 传送信号347
13.3.3 向进程本身传送信号348
13.3.4 设定Linux定时器349
13.3.5 定时等待I/O350
13.3.6 挂起进程352
13.3.7 进程休眠353
13.4 信号集与禁止信号356
13.4.1 信号集和信号集处理函式356
13.4.2 禁止信号358
13.4.3 处理未决信号360
13.4.4 高级信号注册函式362
13.4.5 信号选项实例——SA_NOCLDWAIT选项363
13.4.6 信号选项实例——SA_NODEFER选项364
13.4.7 信号选项实例——SA_RESETHAND选项366
第14章 进程间通信( 教学视频:52分钟)368
14.1 进程间通信概述368
14.1.1 进程间通信简介368
14.1.2 进程间通信的难点369
14.1.3 IPC的多种方式369
14.2 管道370
14.2.1 管道的概念370
14.2.2 匿名半双工管道370
14.2.3 匿名半双工管道的读写操作371
14.2.4 创建管道的标準库函式375
14.3 FIFO管道377
14.3.1 FIFO的概念377
14.3.2 创建FIFO378
14.3.3 FIFO的读写操作379
14.3.4 FIFO的缺点382
14.4 System V IPC/POSIX IPC383
14.4.1 IPC对象的概念383
14.4.2 IPC对象的问题385
14.4.3 IPC对象系统命令385
14.5 共享记忆体386
14.5.1 共享记忆体的概念386
14.5.2 共享记忆体的创建387
14.5.3 共享记忆体的操作388
14.5.4 共享记忆体使用注意事项390
14.6 信号量391
14.6.1 信号量的概念391
14.6.2 信号量的创建392
14.6.3 信号量集的操作394
14.7 讯息伫列396
14.7.1 讯息伫列的概念396
14.7.2 创建讯息伫列397
14.7.3 读写讯息伫列399
第15章 执行绪( 教学视频:34分钟)403
15.1 执行绪与进程403
15.1.1 执行绪的概念403
15.1.2 执行绪的优势404
15.2 执行绪标识符405
15.3 执行绪基本操作405
15.3.1 创建执行绪405
15.3.2 向执行绪体函式传递参数407
15.3.3 执行绪访问资源的限制409
15.3.4 终止执行绪412
15.3.5 正确得到执行绪退出信息的方法415
15.3.6 取消一个执行绪的运行417
15.3.7 执行绪退出函式420
第16章 执行绪高级操作( 教学视频:28分钟)423
16.1 执行绪同步——使用互斥量423
16.1.1 初始化与销毁互斥量423
16.1.2 得到与释放互斥量424
16.1.3 使用互斥量的实例425
16.2 执行绪同步——使用读写锁430
16.2.1 初始化与销毁读写锁430
16.2.2 得到与释放互斥锁431
16.2.3 使用互斥量与读写锁的比较432
16.3 执行绪属性438
16.3.1 创建和销毁属性结构438
16.3.2 执行绪的分离状态439
16.3.3 分离一个已经创建的执行绪440
16.3.4 执行绪栈的属性442
第4篇 Linux档案操作
第17章 档案I/O( 教学视频:71分钟)446
17.1 档案描述符的概念446
17.2 档案I/O操作446
17.2.1 打开一个档案446
17.2.2 打开档案的出错情况450
17.2.3 关闭一个档案450
17.2.4 创建一个新档案451
17.2.5 档案定位453
17.2.6 档案截短455
17.2.7 清空一个档案458
17.2.8 档案的读写操作460
17.2.9 档案同步463
17.3 档案描述符操作465
17.3.1 複製档案描述符465
17.3.2 I/O重定向概念及其套用466
17.3.3 控制档案469
17.3.4 修改打开档案的档案状态470
17.4 非阻塞档案I/O473
17.4.1 非阻塞I/O的概念473
17.4.2 以非阻塞方式打开档案474
17.4.3 将一个打开档案设定为非阻塞方式475
17.5 记忆体映射I/O477
17.5.1 记忆体映射I/O的概念477
17.5.2 创建一个记忆体映射478
17.5.3 撤销一个记忆体映射480
17.5.4 记忆体映射同步482
17.5.5 更改记忆体映射的许可权485
第18章 档案管理( 教学视频:42分钟)487
18.1 档案状态487
18.2 档案类型488
18.3 档案许可权490
18.3.1 访问许可权491
18.3.2 设定用户ID位和设定组ID位492
18.3.3 设定用户ID位的作用493
18.3.4 使用设定用户ID位的实例494
18.4 档案许可权操作496
18.4.1 测试档案访问许可权497
18.4.2 设定用户ID位与档案许可权测试499
18.4.3 使用档案许可权禁止字499
18.4.4 在shell中使用档案许可权禁止字500
18.4.5 在程式中使用档案许可权禁止字501
18.4.6 改变档案访问许可权502
18.4.7 在shell中改变档案许可权503
18.4.8 在程式中改变档案许可权504
18.4.9 改变一个打开的档案许可权505
18.5 档案系统结构509
18.6 档案的硬连结513
18.6.1 创建一个硬连结513
18.6.2 删除一个硬连结515
18.7 改变档案所有者519
18.8 操作档案的时间522
第19章 目录操作( 教学视频:30分钟)526
19.1 目录的许可权526
19.1.1 目录的访问许可权526
19.1.2 测试目录的访问许可权527
19.2 目录操作528
19.2.1 创建一个目录528
19.2.2 删除一个目录529
19.2.3 目录项结构530
19.2.4 打开与关闭目录531
19.2.5 读目录531
19.2.6 读目录操作的实例——实现自己的ls命令534
19.2.7 得到目录档案的读写位置536
19.2.8 定位目录537
19.2.9 回卷目录档案539
19.3 进程的工作目录540
19.3.1 工作目录的概念540
19.3.2 改变进程的工作目录541
19.3.3 得到进程的当前工作目录542
19.3.4 子进程工作目录对父进程的影响545
第20章 特殊档案( 教学视频:32分钟)548
20.1 符号连结操作548
20.1.1 符号连结548
20.1.2 符号连结的功能549
20.1.3 创建符号连结549
20.1.4 创建指向不存在档案的符号连结550
20.1.5 读写符号连结的目的档案551
20.1.6 读写多重符号连结的目的档案553
20.1.7 读写符号连结555
20.1.8 取得符号连结的状态558
20.1.9 更改符号连结的所有者562
20.2 proc档案系统566
20.2.1 proc档案系统566
20.2.2 常用的核心信息567
20.2.3 读取核心信息568
20.2.4 进程状态信息575
20.2.5 读取进程状态576
20.2.6 proc档案系统编程实例——实现自己的ps命令578
第21章 基于流的I/O( 教学视频:30分钟)581
21.1 流与缓冲581
21.2 基于流的档案操作583
21.2.1 打开和关闭流583
21.2.2 档案内容的沖洗585
21.2.3 以字元为单位读写数据587
21.2.4 以行为单位读写数据588
21.2.5 gets()函式的漏洞589
21.2.6 逐行读取档案内容590
21.2.7 输出XML形式的配置档案591
21.2.8 读写数据块593
21.2.9 档案读写实例——实现cp命令594
21.2.10 档案读写实例——字元统计596
21.2.11 档案读写实例——目录下所有档案的字元统计597
第5篇 Linux网路编程
第22章 TCP和UDP协定( 教学视频:22分钟)602
22.1 计算机网路的体系结构简介602
22.1.1 计算机网路体系结构简介602
22.1.2 OSI 参考模型中各层功能描述603
22.1.3 TCP/IP参考模型的各层功能描述603
22.1.4 面向连线服务和无连线服务604
22.2 客户/伺服器方式简介604
22.3 用户数据报协定UDP605
22.3.1 用户数据报的格式605
22.3.2 用户数据报检验和的计算606
22.3.3 UDP用户数据报的特性及用途607
22.4 传输控制协定 TCP608
22.4.1 TCP简介608
22.4.2 TCP报文段的首部608
22.4.3 TCP数据编号与确认609
22.4.4 TCP的流量控制与拥塞控制610
22.4.5 TCP的运输连线管理612
第23章 网路编程基础( 教学视频:50分钟)614
23.1 套接字概念614
23.2 準备工作615
23.2.1 位元组序615
23.2.2 地址格式616
23.2.3 地址形式转换617
23.2.4 获得主机信息619
23.2.5 地址映射620
23.3 套接字基础编程621
23.3.1 建立和销毁套接字描述符621
23.3.2 地址绑定623
23.3.3 建立一个连线624
23.3.4 最简单的网路应用程式——伺服器端626
23.3.5 最简单的网路应用程式——客户端629
23.3.6 使用档案读写函式读写套接字631
23.3.7 使用完整读写函式的网路应用程式634
23.3.8 面向连线的数据传输637
23.3.9 面向连线的网路应用程式——伺服器端638
23.3.10 面向连线的网路应用程式——客户端641
23.3.11 无连线的数据传输643
23.3.12 无连线的网路应用程式——伺服器端644
23.3.13 无连线的网路应用程式——客户端646
23.4 非阻塞套接字649
23.4.1 非阻塞网路应用程式——伺服器端649
23.4.2 非阻塞网路应用程式——客户端651
第24章 网路编程进阶( 教学视频:32分钟)654
24.1 套接字编程深入654
24.1.1 bind函式的作用654
24.1.2 并发伺服器655
24.1.3 UDP协定的connect()函式套用657
24.2 多路选择I/O660
24.2.1 多路选择I/O的概念660
24.2.2 实现多路选择I/O661
24.2.3 使用多路选择I/O处理多个连线663
24.2.4 禁止信号的多路选择I/O666
24.2.5 对比select()函式和pselect()函式667
24.2.6 轮询I/O669
24.3 非网路通信套接字670
24.3.1 非命名UNIX域套接字671
24.3.2 命名UNIX域套接字672
24.3.3 UNIX域套接字实例——伺服器端673
24.3.4 UNIX域套接字实例——客户端677
第25章 网路编程实例——实现档案传输程式( 教学视频:18分钟)679
25.1 程式设计679
25.1.1 整体程式设计679
25.1.2 客户端程式设计679
25.1.3 伺服器端程式设计680
25.2 档案传输程式的实现683
25.2.1 客户端程式的实现——头档案683
25.2.2 客户端程式的实现——程式主函式684
25.2.3 客户端程式的实现——命令拆分函式686
25.2.4 客户端程式的实现——命令处理模组687
25.2.5 伺服器端程式的实现——头档案697
25.2.6 伺服器端程式的实现——程式主函式698
25.2.7 伺服器端程式的实现——客户端命令处理模组699
25.3 测试和验证706
第26章 网路编程实例——简单的Web伺服器( 教学视频:10分钟)707
26.1 程式设计707
26.1.1 整体程式设计707
26.1.2 步骤1——解析客户端传送的内容708
26.1.3 步骤2——寻找客户端需要的档案709
26.1.4 步骤3——将客户端信息返回709
26.2 Web伺服器的实现710
26.2.1 Web伺服器程式的实现——头档案710
26.2.2 Web伺服器程式的实现——程式主函式711
26.2.3 Web伺服器程式的实现——请求处理模组715
26.3 测试和验证719
第6篇 shell脚本知识
第27章 shell脚本基础( 教学视频:32分钟)722
27.1 编写最简单的shell脚本722
27.1.1 使用shell脚本的原因722
27.1.2 脚本内容723
27.1.3 运行一段脚本724
27.2 shell中的变数724
27.2.1 用户自定义变数725
27.2.2 引用变数726
27.2.3 为表达式求值727
27.2.4 变数的类型729
27.2.5 操作自定义变数730
27.2.6 位置变数731
27.2.7 重新分配位置变数732
27.3 退出状态734
27.4 条件测试736
27.4.1 测试档案状态736
27.4.2 测试时使用逻辑操作符738
27.4.3 字元串测试739
27.4.4 测试数值741
第28章 shell脚本中的控制结构( 教学视频:29分钟)743
28.1 shell脚本中的命令替换743
28.2 分支结构744
28.2.1 if/else分支结构744
28.2.2 多重分支结构745
28.2.3 使用case结构的分支语句747
28.2.4 在case语句中使用逻辑表达式749
28.3 条件测试命令的值750
28.3.1 测试整数与字元串751
28.3.2 测试字元串和空值752
28.3.3 测试未初始化的变数752
28.3.4 测试“false”的值753
28.4 循环结构754
28.4.1 while循环结构754
28.4.2 until循环结构757
28.4.3 for循环结构759
28.4.4 break和continue命令762
28.5 定义函式和使用函式764