Linux应用程序开发 基础知识.doc
《Linux应用程序开发 基础知识.doc》由会员分享,可在线阅读,更多相关《Linux应用程序开发 基础知识.doc(67页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux应用程序开发 基础知识目录1. C语言基础 1.1. 数据类型 1.2. 关键字 1.3. 变量等级 1.4. 特殊字符的表示方法: 1.5. 格式化字符串 1.6. 指针与数组 1.7. 结构体 1.8. typedef-自定义类型名 1.9. 函数和宏 1.10. ANSI标准头文件2. 预处理 3. 使用GCC编译程序 4. 使用gdb调试程序 5. Linux程序开发基础 5.1. 路径 5.2. 库文件 5.3. 预处理 5.4. 系统调用(system call)6. 文件处理 7. Linux环境编程 7.1. 参数选项 7.2. 环境变量 7.3. 时间 7.4. 临
2、时文件 7.5. 用户信息 7.6. 日志信息8. 进程 8.1. 进程状态9. 串口编程 9.1. 常用函数 9.2. 设置串口属性 9.3. c_iflag输入标志说明 9.4. c_oflag输出标志说明 9.5. c_cflag控制模式标志说明 9.6. c_cc控制字符说明 9.7. c_lflag本地模式标志说明 9.8. 下面介绍一些常用串口属性的设置方法。10. 安全 10.1. 内核漏洞介绍11. 数据结构(Data Structure) 11.1. 基础概念 11.2. 线性数据结构12. 网络编程 12.1. TCP/IP协议分析 12.2. 入门示例程序13. 存储器寻
3、址 14. 设备驱动程序开发 15. 字符设备驱动程序 15.1. 设备号 15.2. 设备号的分配和释放 15.3. 重要的数据结构 15.4. 读和写16. PCI设备 17. 内核初始化优化宏 18. 访问内核参数的接口 19. 内核初始化选项 20. 内核模块编程 20.1. 入门 20.2. 为模块添加描述信息 20.3. 内核模块处理命令介绍21. 网络子系统 21.1. sk_buff结构 21.2. sk_buff结构操作函数 21.3. net_device结构 21.4. 网络设备初始化 21.5. 网络设备与内核的沟通方式 21.6. 网络设备操作层的初始化 21.7.
4、内核模块加载器 21.8. 虚拟设备 21.9. 8139too.c源码分析 21.10. 内核网络数据流22. 备忘录List of Tables1.1. 特殊字符的表示方法Chapter1.C语言基础Table of Contents1.1. 数据类型 1.2. 关键字 1.3. 变量等级 1.4. 特殊字符的表示方法: 1.5. 格式化字符串 1.6. 指针与数组 1.7. 结构体 1.8. typedef-自定义类型名 1.9. 函数和宏 1.10. ANSI标准头文件Linux是使用C语言开发的,基于Linux平台的应用程序开发,C语言是首选的开发语言。本章记录C语言的基本概念和基础
5、知识。1.1.数据类型整数类型(int),各种整数数制表示法: ddd,十进制表示法,d为0-9的整数,但不能以0开头。如:123,345。 0ooo,八进制表示法,以0(数字0)开头,o为0-7的整数。如:010(八进制)=8(十进制),014(八进制)=12(十进制)。 0xhhh,十六进制表示法,以0x或0X开头,h为0-9、A、B、C、D、E、F。如:0x10(十六进制)=16(十进制),0xA(十六进制)=10(十进制)。 以L或l结尾的数表示长整数(long int),编译器会以32位空间存放此数字,但GCC默认是以32位存放整数,所以此表示法在Linux下没什么作用。1.2.关键
6、字关键字是C语言本身保留使用的,不能用于变量和函数名。auto double int structbreak else long switchcase enum register typedefchar extern return unionconst float short unsignedcontinue for signed voiddefault goto sizeof volatiledo if static while1.3.变量等级 auto,内部变量,在函数内部声明。只能在函数内部使用,它的生命周期从调用函数开始,到函数执行完时消失。内部变量以堆栈存放,必须在函数执行时才会存在
7、,这种方式称为声明。auto可省略。如:auto int i = 0;/* 可写成int i = 0; */内部变量的优缺点:o 内部变量只在函数内有效,能提高函数的安全。o 内部变量在函数结束时消失,不会长期占用内存空间,能提高内存的利用率。o 内部变量的缺点是生命周期短,函数运行结束后不能保留。 static auto,内部静态变量,在函数内部定义,auto也可省略。内部静态变量以固定地址存放,编译时就已分配置内在空间,这种方式称为定义。由于有固定地址,函静态变量不会随函数的结束而消失。static变量会一直保存在内存空间中,当函数再次执行时,上次保留的使用静态变量可以继续使用。如:sta
8、tic int i = 0; extern,外部变量,是在函数外定义的变量,可被多个函数存取。在外部变量定义覆盖范围之内的函数内可以自由使用外部变量。不在外部变量定义覆盖范围之内的函数要使用外部变量就要先使用extern关健字来声明外部变量。int i; /* 外部变量定义,在main函数外 */int main(void)i = 1; /* main()函数位于外部变量i定义的下面,不用声明可直接使用 */printf(%dn, i);不在外部变量定义覆盖范围之内的函数要使用外部变量就要先使用extern关健字来声明外部变量。int main(void)extern int i; /* 外部
9、变量i在main()函数之后定义,需用extern关键字声明后才能使用 */i = 1;printf(%dn,i);int i;.在另外的程序文件中我们也可以通过扩展声明使用其它程序文件中的外部变量。程序1 hello.c#include int main(void) extern int i; /扩展声明外部变量 i = 333; printf(%dn, i); extern des(void); /扩展声明外部函数 des();int i; /外部变量定义程序2 hello1.c#include extern int i; /扩展声明其它程序文件中的外部变量void des() i+; p
10、rintf(%dn,i); 编译debian:/c# gcc hello.c hello1.cdebian:/c# ./a.out333334外部变量有效范围总结:o 由外部变量定义的位置开始,至文件结尾。o 不在有效范围内的函数,也可通过extern扩展声明使用定义的外部变量,且可在多个函数中使用。注意:在各函数中使用的外部变量是一样的,对该变量的修改会影响到其它函数内的同一变量。o 可用extern扩展声明使用另外一个程序文件中的外部变量。外部变量的优点是生命周期长,可在函数间共享数据和传输数据。缺点是变量安全性较低,但可通过合理设置外部变量的有效范围提高安全性。 static exter
11、n,外部静态变量,在函数外部定义,只供单一程序文件使用,即使其它程序文件定义了同样名称的变量,编译器也把它当成另外一个变量处理。外部静态变量能有效隔离变量在一个程序文件中。static int i; register,register变量是以寄存器(register)来存放变量,而不是一般内存。只有内部变量才能使用register类型变量。使用这种变量能加快变量的处理速度。但缺点是要占用CPU寄存器。如:register int i;register int j;变量等级的概念也同样适用于函数。若想调用不在有效范围内的函数,则要用extern扩展声明函数的有效范围。内部变量是以堆栈方式存放的,
12、必须在函数执行时才会存在,所以称为声明(Declaration)。其它如static auto、extern和static extern等级的变量,都是以固定的地址来存放的,而不是以堆栈方式存放的,在程序编译时就已分配了空间,所以称之为定义(Definition)。1.4.特殊字符的表示方法:Table1.1.特殊字符的表示方法符号ASCII字符(十六进制)句柄符号作用a07BEL响铃b08BS回格f0CFF换页n0ALF换行r0DCR回车键t09HTtab键v0BVT空行000NUL空字符5C反斜杠2C单引号22双引号?3F?问号1.5.格式化字符串 %c,表示字符变量。 %s,表示字符串变
13、量。 %f,表示浮点数变量。 %d,表示整数变量。 %x,表示十六进制变量。 %o,表示八进制变量。1.6.指针与数组 C语言中专门用来存放内存地址的变量叫指针(pointer)变量,简称指针。 &运算符用来取得变量地址, *运算符用来取得指针变量的值。 数组名就是地址变量,指向内存中存放第一个数组元素的地址。数组元素编号从0开始,如a0表示数组a的第一个元素。数组是内存中的连续区间,可根据声明类型存放多种数值类型。如:int a10; 声明一个有10个int元素的数组char b20; 声明一个有20个char元素的数组指针示例:int *p; /* p是一个指针,p的内容是内存的地址,在这
14、个地址中将存放一个整数。数组名和指针都是用来存放内存地址的,不过数组名具有固定长度,不可变。而指针与一般变量一样,其值是可变的。1.7.结构体结构体是用户定义的由基本数据类型组成的复合式数据类型。数组也是复合式数据类型,但二者是不同的,数组是相同类型数据的集合,而结构体是不同类型数据的集合。如我们可以把一个人的姓名、性别,年龄组成一个单一结构体。这样在程序处理时就把它当成一个独立对象进行处理。结构体声明方法有两种,一种是分离式声明,一种是结合式声明。分离式声明是先把声明结构体,在程序中再声明结构体变量。结合式声明是把结构体声明和变量声明同时完成。分离式声明示例struct person cha
15、r name; char sex; int age;main(void)struct person worker;.结合式声明示例struct person char name; char sex; int age;worker;每个结构体可以表示一个工人的信息,如果要表示多个工人的信息,则可以用结构体数组。struct person char name; char sex; int age;main(void)struct person worker20; /表示20个工人.结构体初始设置。struct person char name; char sex; int age;worker=j
16、ims,male,30;用.和-运算符存取结构体中的数据。.是直接存取法,-为间接存取法,用于结构体指针。如果p是一个指向person结构体的指针,则p-name和(*p).name的结果是一样的。1.8.typedef-自定义类型名结构体可以自定义数据类型,而typedef可以自定义新的类型名。如:#include typedef char *STRING; /定义一个新的字符指针类型名STRINGmain(void) STRING a; a = abc; printf(the a value is %s.n,a);a为字符指针类型,自定义类型名通常以大写方式表示,以示区别。#define与
17、typedef的区别是:#define只是单纯地进行变量替换,而typedef是创建新的类型名。typedef的一个主要作用是简化声明,提高程序的可读性。如:typedef struct person char name; char sex; int age; p这样我们就定义一个新的结构体类型名p,在程序中我们可以使用它来声明变量。如main(void) p worker; worker = jims,male,30;1.9.函数和宏函数是C代码的集合,每个C程序由一个或多个函数组成,main()是一个特殊的函数,是C程序的入口,每个C程序必须有且只能有一个mian()函数。ANSI函数定义
18、:类型 函数名(类型 参数1,类型 参数2, .) 函数代码;示例:int func(int i, char c) .在程序中要使用我们设计开发的函数,需要先进行声明,函数声明的作用是把函数类型告诉编译器。函数声明与定义差不多,只是不包括程序主体。上面示例的函数在主程序中的声明方式如下:void main() int total; int func(int i, char c); /函数声明 total = int(xxx,xxx); /声明后才能调用该函数 定义和声明中的参数类型(int,char)要相同,但名称(i,c)可以不同。当函数没有返回值时,需声定义成void类型,调用者也要做vo
19、id声明。一般我们把函数的声明放在一个统一的文件中,这个文件叫头文件。在程序中用#include命令把头文件包含进来。在程序中调用函数前就不用再进行函数声明了。头文件简化了函数声明的管理并使头文件可被多个程序重复使用。大大提高C程序的开发效率。例如:我们最常使用的printf()函数,在使用前我们不需每次都进行声明操作,直接使用就可以啦。但前提是我们要把stdio.h头文件包含进来。printf()函数声明在stdio.h文件中已进行了声明。1.10.ANSI标准头文件Linux系统头文件位于/usr/include中。默认情况下编译器只在该目录下搜索头文件。 assert.h,定义asser
20、t宏,可用来检查程序错误。 ctype.h, errno.h float.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.hChapter2.预处理C语言在程序进行编译之前,会先将程序中以#标记的部份进行处理。这种处理叫做预处理。预处理主要的完成以下三个内容:宏处理、头文件和条件式编译。 宏处理指令语法如下:#define 宏名 字符串 示例:#define MAX 200 宏指令语句尾不用加分号(;)宏定义可以用#undef命令取消,我们可以用该功能进行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux应用程序开发 基础知识 Linux 应用程序 开发
限制150内