Linux应用程序开发基础知识.pdf
《Linux应用程序开发基础知识.pdf》由会员分享,可在线阅读,更多相关《Linux应用程序开发基础知识.pdf(68页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、L in u x应用程序开发基础知识目录1.C语言基础1.1.数据类型1.4.特殊字符的表示方法:1.5.格式化字符串1.6.指针与数组1.7.结构体1.8.tvpedef-自定义类型名1.9.函数和宏1.10.ANSI标准头文件2.预处理3.使 用GCC编译程序4.使 用adb调试程序5 .Linux程序开发基础5.1.路径5.2.阵文件5.3.预处理5.4.系统 调 用(system call)6.文件处理7.Linux环境编程7.1.参数选项7.2.环境变量7.3.时间7.4.临时文件7.5.用户信息7.6.II志信息8.进程8.1.进程状态9.串口编程9.1.常用函数9.2.设置串口属
2、性9.3.c iflaa输入标志说明9.4.c oflaa输出标志说明9.5.c cflaa控制模式标志说明9.6.c cc”控制字符说明9.7.c Iflaa木地模式标志说明9.8.卜.一介绍一些常用*I I属性的设置方法。1 0.安 全1 0.1.内核漏洞介绍11.数 据结构(Data Structure)1 1.1.基础概念1 1.2.线性数据结构12.网络编程12.1.TCP/IP协议分析1 2.2.入门示例程序13.存储器寻址14.设备驱动程序开发15 .字符设备驱动程序1 5.1.设备号15.2.设备号的分配和释放1 5.3.一要的数据结构15.4.读和写16.PCI设备17.内核
3、初始化优化宏18.访问内核参数的接II1 9内核初始化选项2 0内核模块编程2 0.1.入门2 0.2.为模块添加描述佶息2 0.3.内核模块处理命令介绍2 1.网络子系统21.1.sk buff 结构21.2.sk buff结构操作函数 device 结构2 1.4.网络设备初始化2 1.5.网络设备与内核的沟通方式2 1.6.网络设备操作层的初始化2 1.7.内核模块加载器21.8.虚拟设备21.9.8139too.c 源码分析2 1.1 0.内核网络数据流2 2.备忘录List of Tables1.1.特殊字符的表示方法Chapter 1 .C 语言基础Table of Content
4、s1.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 语言的基本概念和基础知识。1.1.数据类型整数类型(int),各种整数数制表示法:d d d,十进制表示法,d 为 09 的整数,但不能以0 开头。如:123,345 O ooo,八进制表示法,以0(数字0)开头,。为07的整数。如:010(八进制)=8(十进制),014(八进制)=12
5、(十进制)。O xhhh,十六进制表示法,以Ox或 0X 开头,h 为09、A、B、C、D、E、F。如:0 x10(十六进制)=16(十进制),OxA(十六进制)=10(十进制).以L 或 I 结尾的数表示长整数(long int),编译器会以3 2 位空间存放此数字,但 GCC默认是以3 2 位存放整数,所以此表示法在Linux下没什么作用。1 .2.关键字关键字是C 语言本身保留使用的,不能用于变量和函数名。a u t od o u b l ei n ts t r u c tb r e a ke l s el o n gs w i t c hc a s ee n u mr e gi s t
6、 e rt y p e d e fc h a re x t e r nr e t u r nu n i o nc o n s tf l o a ts h o r tu n s i gn e dc o n t i n u ef o rs i gn e dv o i dd e f a u l tgo t os i z e o fv o l a t i l ed oi fs t a t i cw h i l e1 .3.变量等级 a u to,内部变量,在函数内部声明。只能在函数内部使用,它的生命周期从调用函数开始,到函数执行完时消失。内部变量以堆栈存放,必须在函数执行时才会存在,这种方式称为声明。
7、auto可省略。如:a u t o i n t i =0;/*可写成 i n t i =0;*/内部变量的优缺点:。内部变量只在函数内有效,能提高函数的安全。内部变量在函数结束时消失,不会长期占用内存空间,能提高内存的利用率。内部变量的缺点是生命周期短,函数运行结束后不能保留。static a u to,内部静态变量,在函数内部定义,auto也可省略。内部静态变量以固定地址存放,编译时就已分配置内在空间,这种方式称为定义。由于有固定地址,函静态变量不会随函数的结束而消失。static变量会一直保存在内存空间中,当函数再次执行时,上次保留的使用静态变量可以继续使用。如:s t a t i c i
8、 n t i =0;e x te rn,外部变量,是在函数外定义的变量,可被多个函数存取。在外部变量定义覆盖范围之内的函数内可以自由使用外部变量。不在外部变量定义覆盖范围之内的函数要使用外部变量就要先使用extern关健字来声明外部变量。i n t i ;/*外部变量定义,在ma i n 函数外*/i n t ma i n(v o i d)(i =1;/*ma i n。函数位于外部变量i 定义的下面,不用声明可直接使用*/p r i n t f (/%d n,/,i);)不在外部变量定义覆盖范围之内的函数要使用外部变量就要先使用extern关健字来声明外部变量。i n t ma i n(v o
9、 i d)(e x t e r n i n t i ;/*外部变量i 在ma i n ()函数之后定义,需用e x t e r n 关键字声明后才能使用*/i =1;p r i n t f(%d n ,i);)i n t i;在另外的程序文件中我们也可以通过扩展声明使用其它程序文件中的外部变量。程序 1 h e llo,cS i n c lu d e i n t ma i n(v o i d)(e x t e r n i n t i;/扩展声明外部变量i =3 3 3;p r i n t f (,%d n,/,i);e x t e r n d e s (v o i d);扩展声明外部函数d e
10、 s();)i n t i;外部变量定义程序 2 h e llo l.cS i n c lu d e e x t e r n i n t i;扩展声明其它程序文件中的外部变量v o i d d e s ()(i+;p r i n t f (9 6 d n,i);)编译d e b i a n:/c#g c c h e llo,c h e llo l.cd e b i a n:/c#./a.o u t3 3 33 3 4外部变量有效范围总结:。由外部变量定义的位置开始,至文件结尾。不在有效范围内的函数,也可通过extern扩展声明使用定义的外部变量,且可在多个函数中使用。注意:在各函数中使用的外部
11、变量是一样的,对该变量的修改会影响到其它函数内的同变量。可用extern扩展声明使用另外一个程序文件中的外部变量。外部变量的优点是生命周期长,可在函数间共享数据和传输数据。缺点是变量安全性较低,但可通过合理设置外部变量的有效范围提高安全性。static extern,外部静态变量,在函数外部定义,只供单一程序文件使用,即使其它程序文件定义了同样名称的变量,编译器也把它当成另外一个变量处理。外部静态变量能有效隔离变量在一个程序文件中。s t a t i c i n t i;register,register变量是以寄存器(register)来存放变量,而不是一般内存。只有内部变量才能使用regi
12、ster类型变量。使用这种变量能加快变量的处理速度。但缺点是要占用CPU寄存器。如:r e g i s t e r i n t i;r e g i s t e r i n t j;变量等级的概念也同样适用于函数。若想调用不在有效范围内的函数,则要用extern扩展声明函数的有效范围。内部变量是以堆栈方式存放的,必须在函数执行时才会存在,所以称为声明(Declaration)。其它如staticauto、extern和static extern等级的变量,都是以固定的地址来存放的,而不是以堆栈方式存放的,在程序编译时就己分配了空间,所以称之为定义(Definition)o1.4.特殊字符的表示方
13、法:Table 1.1.特殊字符的表示方法符号ASCI I字符(十六进制)句柄符号作用a07BEL响铃b08BS回格focFF换页n0ALF换行r0DCR回车键t09HTtab键vOBVT空行000NUL空字符5 C反斜杠,2C单引号H22ii双引号?3F?问号1.5.格式化字符串%c,表示字符变量。%s,表示字符串变量。%f,表示浮点数变量。%d,表示整数变量。%x,表示十六进制变量。%o,表示八进制变量。1.6.指针与数组 C语言中专门用来存放内存地址的变量叫指针(pointer)变量,简称指针。&运算符用来取得变量地址,*”运算符用来取得指针变量的值。数组名就是地址变量,指向内存中存放第
14、一 个 数组元素的地址。数组元素编号从0开始,如a0表示数组a的第一个元素。数组是内存中的连续区间,可根据声明类型存放多种数值类型。如:int a10;char b20;声明一个有10个int元素的数组声明一个有2 0个char元素的数组指针示例:int*p;/*p是一个指针,p的内容是内存的地址,在这个地址中将存放一个整数。数组名和指针都是用来存放内存地址的,不过数组名具有固定长度,不可变。而指针与般变量一样,其值是可变的。1 .7.结构体结构体是用户定义的由基本数据类型组成的复合式数据类型。数组也是复合式数据类型,但二者是不同的,数组是相同类型数据的集合,而结构体是不同类型数据的集合。如我
15、们可以把一个人的姓名、性别,年龄组成个单 结构体。这样在程序处理时就把它当成个独立对象进行处理。结构体声明方法有两种,一种是分离式声明,一种是结合式声明。分离式声明是先把声明结构体,在程序中再声明结构体变量。结合式声明是把结构体声明和变量声明同时完成。分离式声明示例struct person(char name;char sex;int age;);m a i n(v o i d)s t r u c t p e r s o n w o r k e r;结合式声明示例s t r u c t p e r s o n c h a r n a m e;c h a r s e x;i n t a g e
16、;w o r k e r;每个结构体可以表示个工人的信息,如果要表示多个工人的信息,则可以用结构体数组。s t r u c t p e r s o n c h a r n a m e;c h a r s e x;i n t a g e;);m a i n(v o i d)s t r u c t p e r s o n w o r k e r 2 0 ;表示 2 0 个工人)结构体初始设置。s t r u c t p e r s o n c h a r n a m e;c h a r s e x;i n t a g e;w o r k e r=j i m s,“m a l e”,3 0 ;用”.
17、“和运算符存取结构体中的数据c 是直接存取法,”为间接存取法,用于结构体指针。如果p 是个指向person结构体的指针,则 p-name 和(*p).nam e的结果是样的。1.8.typ e d e f-自定义类型名结构体可以自定义数据类型,而 typedef可以自定义新的类型名。如:t t i n c l u de t y p e de f c h a r *S T R I N G;定义一个新的字符指针类型名S T R I N Gm a i n(v o i d)S T R I N G a;a =a b c ;p r i n t f (z/t h e a v a l u e i s%s.n
18、,a);)a为字符指针类型,自定义类型名通常以大写方式表示,以示区别。#define与typedef的区别是:#define只是单纯地进行变量替换,而typedef是创建新的类型名。typedef的个主要作用是简化声明,提高程序的可读性。如:t y p e de f s t r u c t p e r s o n c h a r n a m e;c h a r s e x;i n t a g e;P这样我们就定义一个新的结构体类型名P,在程序中我们可以使用它来声明变量。如m a i n(v o i d)p w o r k e r;w o r k e r =j i m s ,m a l e ,3
19、 0);1 .9.函数和宏函数是C代码的集合,每个C程序由个或多个函数组成,main。是个特殊的函数,是C程序的入口,每个C程序必须有且只能有一个mian()函数。ANSI函数定义:类型函数名(类型参数1,类型参数2,.)函数代码;)示例:i n t f u n c(i n t i,c h a r c)在程序中要使用我们设计开发的函数,需要先进行声明,函数声明的作用是把函数类型告诉编译器。函数声明与定义差不多,只是不包括程序主体。上面示例的函数在主程序中的声明方式如卜.:v o i d m a i n()(i n t t o t a l;i n t f u n c (i n t i,c h a
20、 r c);函数声明t o t a l =i n t (x x x,x x x);声明后才能调用该函数定义和声明中的参数类型(int,char)要相同,但名称(i,c)可以不同。当函数没有返回值时,需声定义成void类型,调用者也要做void声明。一般我们把函数的声明放在一个统一的文件中,这个文件叫头文件。在程序中用#include命令把头文件包含进来。在程序中调用函数前就不用再进行函数声明了。头文件简化了函数声明的管理并使头文件可被多个程序重复使用。大大提高C程序的开发效率。例如:我们最常使用的printf()函数,在使用前我们不需每次都进行声明操作,直接使用就可以啦。但前提是我们要把std
21、io.h头文件包含进来。printf()函数声明在stdio.h文件中已进行了声明。1 .10.A N S I标准头文件Linux系统头文件位于/usr/include中。默认情况下编译器只在该目录下搜索头文件。assert.h,定义assert宏,可用来检查程序错误。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.hChapter 2.预处理C语言在程序进行编译之前,会先将程序中以“#”标记的部份进行处理。这种
22、处理叫做预处理。预处理主要的完成以卜三个内容:宏处理、头文件和条件式编译。宏处理指令语法如下:#d e f i n e 宏名字符串示例:#d e f i n e M A X 2 00宏指令语句尾不用加分号(;)宏定义可以用#undef命令取消,我们可以用该功能进行程序调试。头文件处理是把头文件中的函数声明插入程序中。条件式编译,编译器可根据条件式编译语句有选择地进代码块进行编译。选择式编译指令如卜.:#i f 表达式#i f d e f 宏名S i f n d e f 宏名t t e l s e#e n d i f如果表示式结果不为0,则编译下面的程序若宏名已被定义,则编译下面的程序若宏名未定
23、义,则编译下面的程序前面条件不成立时,则编译下面的程序结束上列各种条件式编译Chapter 3.使用GCC编译程序直接生成a.out可执行文件d e b i a n:/c#g c c h e l l o,c编译hello.c程序,生成hello可执行文件:d e b i a n:/c#g c c -o h e l l o h e l l o,c生成.s的汇编代码文件。d e b i a n r/c#g c c -S h e l l o,cChapter 4.使用g d b 调试程序如果想利用gdb工具来调试程序,在编译程序时要使用-g选项。如:d e b i a n:/c#g c c -g s
24、 e r i a l,c -o s e r i a l调试serial程序。d e b i a n:/c#g d b s e r i a lG N U g d b 6.5-d e b i a nC o p y r i g h t (C)2006 Fr e e S o f t w a r e Fo u n d a t i o n,In c.GDB i s f r e e s o f t w a r e,c o v e r e d b y t h e GN U Ge n e r a l P u b l i c L i c e n s e,a n d y o ua r ew e l c o m e
25、t o c h a n g e i t a n d/o r d i s t r i b u t e c o p i e s o f i t u n d e r c e r t a i nc o n d i t i o n s.T y p e s h o w c o p y i n g t o s e e t h e c o n d i t i o n s.T h e r e i s a b s o l u t e l y n o w a r r a n t y f o r GDB.T y p e s h o w w a r r a n t yz/f o r d e t a i l s.T h
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 应用程序 开发 基础知识
限制150内