Linux C程序设计王者归来(附光盘) PDF下载 公众号 其他格式

手机扫码免费下载

纠错留言

#电子书截图

Linux C程序设计王者归来(附光盘)截图

#电子书简介

吴岳,毕业于北京航空航天大学,获硕士学位。有超过15年的Linux环境开发经验,精通Linux系统函数接口、Linux内核、POSIX、TCP/IP协议。对Linux内核及基于Linux的分布式系统有深入研究。目前致力于基于Linux的分布式系统的优化和并行算法的研究。十分喜爱开源项目,业余从事开源项目的普及和推广工作。曾经参与IBM公司的手写笔项目、某电子公司的GPS车载终端项目等。


第3 章 C 语言中的函数
函数是一种特殊的控制流程,只有理解函数调用的本质才能够更好地理解程序中的存储类别和模块化程序设计的思想。本章将详细介绍函数。
3.1 函数的本质
函数的代码存储在内存中的代码段中,每个C 语言程序都有一个代码段。下面实例给出了一个C 语言函数和其翻译为汇编代码的形式。
?说明:函数的本质是一段二进制可执行代码,这些代码是一些可以被机器直接执行的指令。
程序清单3-1 swap.c 实现两个整数交换位置并且相加的函数
01 int swap(int *a, int *b)
02 {
03 int tmp;
04 tmp = *a; /* 交换两个指针所指向的内容 */
05 *a = *b;
06 *b = tmp; /* 交换两个变量的值 */
07 return *a + *b; /* 返回二者的和 */
08 }
在翻译为汇编语言时,函数被翻译成为一段相对独立的汇编代码,并且使用函数名作为标号,表示此段代码的入口。当程序中需要调用该函数时,只需要跳转到这个标号处执行标号后面的函数代码就可以了。在内存中该函数机器指令的存储如图3-1 所示。
由此可知,函数的本质是一段机器指令代码。而函数名的本质是一个标号,该标号的值等于内存中存储函数代码的内存空间的首地址。函数在调用时会使进程空间中的栈不断增长,从当前进程空间中的栈顶的位置到函数保存返回地址的位置,这块内存称为函数的栈帧。所有函数中定义的局部变量都存储在函数的栈帧上。当函数结束调用时该块栈帧就消失了,如图3-2 所示。
图3-1 函数调用的示意图
第3 章 C 语言中的函数
图3-2 函数的栈帧
3.2 变量的作用域和生命期
C 语言中每一个变量都有自己的作用域和生命期。作用域表示可以引用该变量的代码区域,生命期表示变量的存储空间所保存的时间。如果以变量的生命期来分类的话,C 语言中的变量包括两种类型:一种是全局变量,一种是局部变量。本节将详细介绍变量的作用域和生命期。
3.2.1 全局变量
全局变量也称为外部变量,这种变量是在函数外部定义的。因此它们不属于任何一个函数,而是属于一个源程序文件。其作用域从定义该变量的这一行开始,一直可以持续到定义该变量的源程序文件的结束。在该区间内所有的函数都可以引用该变量。下面实例演示了一个全局变量的使用。该程序定义了一个全局变量,之后在两个函数中引用这个全局变量,并分别计算这个全局变量和函数参数的和,最后输出结果。
(1)在vi 编辑器中编辑该程序。
程序清单3-2 global.c 全局变量的使用
01 #inlcude
02 int add(int a, int b)
03 {
04 return a + b; /* 全局变量b 的作用域达不到这里,因此add()函数看不到全局变量b */
05 }
06 int b = 10; /* 定义一个全局变量b,以后的函数可以应用这个全局变量 */
07 int mul(int a)
08 {
09 return a * b; /* 在mul()函数中引用全局变量b */
10 }
11 int main(void)
12 {
13 int res1; /* 保存结果的临时变量 */
14 int res2;
15 res1 = add(1, 5); /* 调用add()函数 */
16 res2 = mul(1); /* 调用mul()函数 */
17 printf("res1 : %d, res2 : %d\n", res1, res2);
18 printf("the global b : %d\n", b); /* 在main()函数中引用全局变量b */
19 return 0;
20 }
(2)在shell 中编译该程序。
$gcc global.c -o global
(3)在shell 中运行该程序。
$./global
res1 :6, res2 : 10
the global b : 10
在全局变量b 定义之前先定义了add()函数,因此add()函数不能引用这个全局变量。如果希望在add()函数中也可以引用该变量,则需要在add()函数之前加上对全局变量b 的声明,之后add()函数就可以引用该变量了。
...
int b; /* 添加对全局变量b 的声明,编译器会自动寻找该变量的定义 */
int add(int a)
{
return a + b; /* 声明之后可以在函数add()中引用该变量 */
}
int b = 10; /* 定义该变量 */
...
3.2.2 局部变量
局部变量也称为内部变量,其定义在函数或者复合语句的内部。其作用域仅限于函数或者复合语句内,离开该函数或者复合语句后就无法再引用该函数。?注意:定义在复合语句内部的变量同样是局部变量。下面实例演示了局部变量的使用。该程序在复合语句内部定义了一个局部变量res,该局部变量在复合语句之外不能引用。因此在定义该变量的复合语句之外此变量就失效了。
(1)在vi 编辑器中编辑该程序。
程序清单3-3 local.c 演示使用局部变量
01 #include
02 int add(int a, int b)
03 {
04 return a + b; /* add()函数内部不能引用main()函数中定义的局部变量 05 */
06 }
07 int main(void)
08 {
09 int array[5]; /* 局部变量数组 */
10 int i=0;
11 while(i < 5){
12 int res; /* res 定义在复合语句内部,因此res 也是一个局部变量,在复合语句之外不能引用 */
13 res = add(i, 1); /* 对数组每个元素赋值 */
14 array[i] = res; /* 将结果保存在数组中 */
15 i++;
16 }
17 for(i = 0; i < 5; i++)
14 printf("array[%d] : %d\n", i + 1, array[i]); /* 输出每一个数组元素 */
15 return 0;
16 }
(2)在shell 中编译该程序。
$gcc local.c -o local
(3)在shell 中执行该程序。
$./local
array[1] : 1
array[2] : 2
array[3] : 3
array[4] : 4
array[5] : 5
res 是一个局部变量,在复合语句结束之后,变量res 同样不能再被该函数中的其他语句所引用。也就是说res 变量的作用域仅限于while 语句的循环中。?说明:全局变量的生命期是整个程,而局部变量的生命期仅在函数调用未结束之前有效。因此,变量的作用域实际上是由变量的生命期来决定的,如图3-3 所示。
图3-3 变量生命期示意图
3.3 变量的初始值
变量在定义之后要占用存储空间,如果未对变量进行初始化,这时变量中的值是多少呢?本节将介绍变量的初始值。
3.3.1 全局变量的初始值
对于全局变量来说,如果一个全局变量未被初始化,其初始值由编译器自动设置为0。因此在使用一个全局变量时,不需要考虑其初值问题,直接使用就可以了。下面实例演示了输出一个未初始化的全局变量的初始值。该程序定义了一个全局变量,但是未对其进行初始化。之后在程序中输出该变量的值,以观察该变量的初始值。(1)在vi 编辑器中编辑该程序。
程序清单3-4 uninit_global.c 输出一个未初始化的全局变量的值
01 #incllude
02 int a; /* 全局变量 */
03 int main(void)
04 {
05 printf("the global : %d\n", a); /* 输出全局变量的值 */
06 return 0;
07 }
(2)在shell 中编译该程序。
$gcc uninit_global.c -o uninit_global
(3)在shell 中运行该程序。
$./ uninit_global
the global : 0
3.3.2 局部变量的初始值
局部变量存储在内存的堆栈中。定义了局部变量之后,编译器不会将其初始化为0,而是使用其占用的内存空间原有的值。这时的值是一个随机值,与本次程序无关,如图3-4所示。因此,如果对局部变量不初始化就直接引用是很危险的。下面实例演示了这种危险的用法。该程序计算1~10 之间整数的和。在main()函数中定义了一个局部变量sum,并使用它作为存储累加和的临时变量。
(1)在vi 编辑器中编辑该程序。
图3-4 函数栈帧占用内存空间示意图
程序清单3-5 sum.c 累加1~10 之间整数的和
01 #include
02 int main(void)
03 {
04 int i;
05 int sum; /* 定义一个局部变量,该局部变量作为一个累加和的临时值 */
06 for(i = 1; i <= 10; i++)
07 sum += i; /* 每次累加i */
08 printf("the sum is : %d\n", sum); /* 输出运算结果 */
09 return 0;
10 }
(2)在shell 中编译该程序。
$gcc sum.c -o sum
(3)在shell 中运行该程序。
$./sum
the sum is : -10926734
程序执行之后的结果和预料的大相径庭。原因在于在使用sum 作为累加和之前没有对sum 进行初始化,所以sum 的起始值并不是0,而是sum 所在的存储单元中之前保存的一个无用值。这个值是随机的,可能是一个非常大的整数。这样的累加造成了sum 变量溢出。由此可知,对一个局部变量进行初始化是多么重要。
注意:如果不进行初始化,这种错误不仅无法避免,而且很难调试。
……

第1篇 Linux下C语言基础

第1章 Linux简介( 教学视频:16分钟)

1.1 GNU简介

1.2 Linux简介

1.2.1 Linux 发展史

1.2.2 Linux发行版

1.2.3 Linux内核版本

1.2.4 Linux与UNIX的关系

1.2.5 Linux在服务器方面的发展

1.2.6 Linux在嵌入式系统方面的发展

1.2.7 Linux在桌面系统方面的发展

1.3 Linux 环境下的其他编程语言

1.3.1 C++

1.3.2 Java

1.3.3 Perl

1.3.4 Python

1.3.5 Ruby

1.3.6 PHP

第2章 控制结构( 教学视频:56分钟)

2.1 goto语句

2.1.1 C语言中的无条件跳转

2.1.2 使用goto语句进行出错处理

2.1.3 出错处理的一般模型

2.2 C语言中的分支结构

2.2.1 分支结构的翻译

2.2.2 使用goto语句实现分支结构

2.3 短路计算

2.3.1 短路计算

2.3.2 &&运算的短路计算

2.3.3 ||运算的短路计算

2.4 C语言中的循环结构

2.4.1 while循环

2.4.2 do…while循环

2.4.3 for循环

2.5 switch语句

2.5.1 switch语句的应用

2.5.2 使用goto语句实现switch语句

2.6 优化控制结构

2.6.1 表达式优化——使用替换程序中的乘除法

2.6.2 表达式优化——常量折叠

2.6.3 表达式优化——使用数学公式

2.6.4 表达式优化——存储问题

2.6.5 分支优化——改变判断顺序

2.6.6 分支优化——使用switch语句

2.6.7 循环优化——一次性计算

第3章 C语言中的函数( 教学视频:56分钟)

3.1 函数的本质

3.2 变量的作用域和生命期

3.2.1 全局变量

3.2.2 局部变量

3.3 变量的初始值

3.3.1 全局变量的初始值

3.3.2 局部变量的初始值

3.4 与函数有关的优化

3.4.1 函数调用与程序优化

3.4.2 变量存储优化

3.5 编写多文件程序——变量的存储类别

3.5.1 存储类别

3.5.2 static变量的作用——改变变量的生命期

3.5.3 static变量的作用——实现封装和模块化设计

3.6 编写多文件的程序——链接的作用

3.6.1 链接多个文件

3.6.2 链接时符号解析规则

3.6.3 链接规则的应用

3.7 可变参数

3.7.1 可变参数的概念

3.7.2 实现一个简单的可变参数的函数

3.7.3 可变参数实例

3.7.4 关于printf()函数的疑问——缺少整型参数

3.7.5 关于printf()函数的疑问——缺少字符串地址参数

第4章 C语言中的指针与字符串( 教学视频:48分钟)

第5章 C语言的高级技术( 教学视频:30分钟)

第2篇 C语言开发环境

第6章 vi编辑器( 教学视频:44分钟)

第7章 gcc编译器( 教学视频:27分钟)

第8章 构建makefile文件( 教学视频:46分钟)

第9章 gdb调试器( 教学视频:27分钟)

第3篇 Linux进程操作

第10章 进程环境( 教学视频:44分钟)

第11章 进程控制( 教学视频:45分钟)

第12章 时间和日历历程( 教学视频:7分钟)

第13章 信号及信号处理( 教学视频:48分钟)

第14章 进程间通信( 教学视频:52分钟)

第15章 线程( 教学视频:34分钟)

第16章 线程高级操作( 教学视频:28分钟)

第4篇 Linux文件操作

第17章 文件I/O( 教学视频:71分钟)

第18章 文件管理( 教学视频:42分钟)

第19章 目录操作( 教学视频:30分钟)

第20章 特殊文件( 教学视频:32分钟)

第21章 基于流的I/O( 教学视频:30分钟)

第5篇 Linux网络编程

第22章 TCP和UDP协议( 教学视频:22分钟)

第23章 网络编程基础( 教学视频:50分钟)

第24章 网络编程进阶( 教学视频:32分钟)

第25章 网络编程实例——实现文件传输程序( 教学视频:18分钟)

第26章 网络编程实例——简单的Web服务器( 教学视频:10分钟)

第6篇 shell脚本知识

第27章 shell脚本基础( 教学视频:32分钟)

第28章 shell脚本中的控制结构( 教学视频:29分钟)

《Linux C程序设计王者归来》由浅入深,全面细致地讲述了Linux环境C程序设计从基本概念到实际操作,从核心原理到具体实践,再到实际案例开发等内容,涵盖了Linux C程序设计的所有重要知识点。本书讲解时结合大量实例,便于读者通过动手实践更加深刻地理解所学知识。另外,本书配1张DVD光盘,内容为作者专门为本书录制的16.8小时高清配套教学视频、本书涉及的实例源文件及其他相关学习资料。
《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程序设计王者归来》适合所有想全面学习Linux C开发技术的人员阅读,也适合各种使用Linux C做开发的工程技术人员阅读。对于长期在Linux平台做开发的程序员,本书更是一本不可多得的案头必备参考书。
超值、大容量DVD光盘
本书实例源文件
16.8小时高清配套教学视频
7小时Linux C编程专题视频讲座
Ubuntu安装镜像文件(32位与64位)

资深程序员15年开发经验的总结,全面、深入剖析Linux环境C程序设计的精髓
涵盖Linux C编程基础、开发环境、进程操作、文件操作、网路编程和Shell编程
视频教学:专门录制了16.8小时高清配套教学视频,赠送7小时专题视频,便于读者更加高效、直观地学习
内容全面:涵盖Linux下C语言基础、开发工具、Linux系统机制和Shell编程等
讲解详细:对每个知识点都从原理、作用、语法、示例和技巧等多角度进行分析
贴近实际:对开发中经常用到的Linux进程操作、文件操作和网络编程做了深入剖析
重点突出:对C语言本质和Linux程序设计中容易遇到的问题和难点进行了深入剖析
对比讲解:对Linux和Windows系统开发中的相关概念进行了对比讲解
注重实用:提供了643个典型示例、412个开发技巧和2个综合开发案例

http://img30.360buyimg.com/vc/jfs/t238/72/822134519/405542/accfb9a7/53f1d22eNf44a7441.jpg

Linux系统以其免费、开源等特点,在服务器解决方案、嵌入式开发和计算机安全等领域的优势已经越来越明显,也越来越被更多的开发人员所认 同。在Linux系统下,最为有效的开发方式是采用C语言开发。IT行业的人才招聘也可以印证这一点。很明显,基于Linux系统开发的人员需求量不断增 加,尤其对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小时的配套高清多媒体教学视频,便于让读者更加轻松、直观地学习,从而提高学习效率。这些视频与本书源代码一起收录于配书光盘中。
6.技术支持,答疑解惑
本书提供技术答疑服务。读者在阅读本书时如果有什么疑问或者发现了疏漏之处,可以发E-mail以获得帮助,也可以在本书的技术论坛上留言,会有专人负责答疑。
本书内容
第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本身就是开源的系统,从诞生之日起,就和技术交流密切相关。根据笔者的经验,技术交流和网络资源对开发者而言是至关重要的。希望读者一开始就能注意到技术交流的重要性。
* 坚持编程:程序设计是实践性很强的事,除了要掌握好基本的语法和理论外,还需要长期坚持动手实践,只有这样才能避免“纸上谈兵”,胜任实际的工作要求。
本书读者对象
* Linux环境C语言编程的初学者;
* 研究Linux系统函数接口的人员;
* Linux桌面应用开发人员;
* Linux服务器程序开发人员;
* 嵌入式Linux程序开发人员;
* 在Linux环境下做毕业设计的学生;
* Linux环境C语言编程爱好者;
* 大中专院校和社会培训班的学生;
* 需要一本案头必备手册的程序员。
希望各位读者通过阅读本书,能很好地掌握Linux环境C语言开发技术,成为这个领域中的“王者”,笔者将倍感欣慰!所学授之于人,不亦乐乎?最后祝读书快乐!


  • 评论列表(0

留言评论