培训资料:Linux编程知识.ppt_第1页
培训资料:Linux编程知识.ppt_第2页
培训资料:Linux编程知识.ppt_第3页
培训资料:Linux编程知识.ppt_第4页
培训资料:Linux编程知识.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux编程知识,主要内容,Linux编程的风格及与COMWARE的比较Linux程序的常见概念LinuxMake的使用,Linux编程的风格,变量类型:Linux的更直观:u_int32_tVSULONG变量命名:Linux采用全小写,简短,但对英语要求较高COMWARE;采用的是匈牙利命名法,容易理解,但长度较长控制块的使用:COMWARE是强制要求if、else等后面必须有,不容易出错;而Linux是能不用则不用,且尽量多容纳有效行函数返回值:功能性的函数,Linux一般是0返回正确,小于0的是出错;COMWARE是VOS_OK正确,VOS_ERR错误常数的使用:Linux使用常数的地

2、方较多,需联系上下文才能看懂;COMWARE是提倡用有意义的宏来代替,能够顾名思义.Linux用的是最新gcc编译器,支持C99,可变宏、更多的关键字,等等,编码更灵活;COMWARE仅支持ANSIC89总之,Linux是天才们的编码,更追求技术;COMWARE是普通人的编码,更追求稳定,Linux程序的常见概念(一),进程:亦可称为任务。Linux下的进程互不影响,各自使用独立的空间,由CPU、OS共同负责内存保护、任务切换;COMWARE使用相同的地址空间,能够互相访问,因此也会发生踩内存的现象。COMWARE下启动任务是VOS_T_Create函数,通常是任务A调用该函数来启动B,两者代

3、码通常不相同。Linux是fork函数来启动子进程。通常返回值PID来区分:1、返回值是0,则是子进程,子进程可以通过getpid来获取自身PID2、返回值是-1,表明创建任务出错3、其它,则是父进程,并得到了子进程的PID,Linux程序的常见概念(一),fork代码常见形式:.if(pid=fork()=0)/*Childprocess*/elseif(pid=-1)/*ErrorHandler*/else/*Parentprocess*/.,Linux程序的常见概念(二),线程:可以说是轻量级的进程。创建一个线程比创建一个进程的开销少得多。同一个进程下的线程可以共享父进程的所有资源,很方

4、便地实现线程间的通讯。COMWARE不支持。Linux下用得也较少。Windows下用得最多。线程通常是用来UI和Function分离:主线程负责从图形化界面上接收用户的数据,并将其传给对应的子线程。子线程负责接收数据并计算,并将结果返回给主线程,由主线程显示给用户。好处:避免了长时间的计算,用户无法进行控制。缺点:编码时需要考虑同步、互斥的问题。Miniware短时间内不会用到线程。有兴趣的可参考pthread_create,Linux程序的常见概念(三),共享链接库:共享一份代码,数据各自独立,更常用的是COW-CopyonWrite与可执行文件的区别:不能直接运行,不需要main函数编译

5、共享链接库时,需要使用-fPIC和-shared别的程序要使用,编码时需要提供头文件,声明各函数;链接时,需要-L给出链接库的目录以及-l给出链接库的名称程序运行时,由OS负责装入-fPIC:Position-IndependentCode:AccessallconstantaddressesthroughaGlobalOffsetTable与静态库的区别:静态库的代码是编译链接时使用,而且用哪些链接哪些,使用一次链接一次,编译链接后直接存在于可执行文件中,类似于C语言中的#define;共享链接库是运行时加载,链接时放在可执行文件的是文件名和代码起始地址(或函数名),类似于C语言的函数调用,

6、Linux程序的常见概念(三),对于Miniware来说,静态库的代码已经是vmlinux.64文件中可执行文件的一部分;而共享链接库的代码则是vmlinux.64文件中不可执行的文件,放在ramfs,执行时才会用到。COMWARE没有共享链接库的说法。Linux还可以动态加载共享链接库,但需要程序员的额外编码。避免了一开始就加载,但后续用不到的浪费(比如if分支加载不同的动态链接库)。Linux下是dlopen、dlsym;Miniware基本不需要用到该特性。,Linux程序的常见概念(四),信号量:用于访问全局资源的互斥、进程间同步的手段。本质是非负的整数计数器。使用者在访问全局资源前,

7、首先需要去获取一个信号,如果计数器大于0,则使用者可以获取成功;否则的话,使用者的任务将会被挂起;获取信号量成功后,可以开始访问全局资源;访问结束后,应当及时释放,使得在其上面阻塞的任务能够尽快得到调度。如果计数器初始化为1,且只有两个竞争者,则是互斥的典型现象。,Linux程序的常见概念(四),sem_init:用于初始化一个信号量sem_wait:获取信号量,如果计数器当前大于0,则获取成功,否则任务被挂起sem_trywait:获取信号号,与sem_wait的区别是获取不成功,不会被挂起sem_post:释放信号量,访问全局资源后,应当及时释放上述函数仅用于Linux线程间的同步,Lin

8、ux程序的常见概念(四),semget:用于初始化一个信号量semop:操作一个信号量,获取还是释放semctl:控制一个信号量,通常初始化初值或者释放信号量所使用的内核资源上述函数可用于Linux进程间的同步,Linux程序的常见概念(四),#defineMY_KEY5555structsembufoperation1;unionsemunintval;structsemid_ds*buf;USHORT*array;semctl_arg,ignored_argument;intsemidsemid=semget(MY_KEY,1,IPC_CREATE);/SetInitialvaluefor

9、theresource-initiallyoneprocessownedsemctl_arg.val=1;/Settingsemvalto1semctl(semid,0,SETVAL,semctl_arg);,Linux程序的常见概念(四),/getsemaphoreoperation0.sem_op=-1;operation0.sem_num=0;operation0.sem_flg=IPC_WAIT;semop(semid,operation,1);/accessglobalsharedresource/releasesemaphoreoperation0.sem_op=1;operati

10、on0.sem_num=0;operation0.sem_flg=IPC_WAITsemop(semid,operation,0);/closesemaphoresemctl(semid,1,IPC_RMID,ignored_argument);,Linux程序的常见概念(四),内核的锁:通常来说,内核很少会用到信号量,更多的是用到读写同步锁使用宏DEFINE_RWLOCK(lockname)来定义一个锁使用write_lock_bh、write_unlock_bh和read_lock_bh、read_lock_bh来上锁、解锁自旋锁用得也很多:spin_lock、spin_unlock,Li

11、nux程序的常见概念(四),COMWARE由于任务是互斥的,通常不必考虑互斥,进程间通信基本是基于消息队列Linux的SystemV是从Unix学习而来的,函数的控制参数多带有IPC字段Windows的对信号量、事件、互斥量等,函数名、函数参数上各自独立,有较好的理解性,Linux程序的常见概念(五),共享内存:进程间通信的常用方法创建一块共享内存:intshmget(key_tkey,intsize,intshmflg);其中key必须是唯一,并且这组进程调用该函数时,key必须相同。否则的话,得到的共享内存,也许属于别的进程。shmflg通常是IPC_CREAT,表示不存在该共享内存时则创

12、建,存在的话则去打开。除非失败,否则都会得到该内存的描述符,Linux程序的常见概念(五),得到描述符后,通常调用shmat,把当前进程与该共享内存关联起来。intshmat(intshmid,char*shmaddr,intshmflg);后两个参数通常填0shmaddr填0的话则系统自动去选择系统一块空闲内存与共享内存关联起来。非0表示使用指定的内存地址,容易引起冲突返回值是这块内存的起始地址,注意保存,Linux程序的常见概念(五),不需要再使用时,shmdt将其引用计数释放掉原型:intshmdt(char*shmaddr)即使释放到0,该内存也不会释放,除非使用shmctl将其标志为

13、可移除intshmctl(intshmqid,intcmd,structshmid_ds*buf)cmd为IPC_RMID,表示标志其为可移除,Linux程序的常见概念(五),#defineMY_KEY55555#defineMY_SIZE2048/*Process1*/shmid=shmget(MY_KEY,MY_SIZE,IPC_CREATE);char*p=(char*)shmat(shmid,0,0)/*此时p指向该共享内存的起始地址,通过信号量或锁,占住该资源后,即可往该内存里读、写*/.shmdt(p);/*释放信号量或锁*/,Linux程序的常见概念(五),/*Process2*

14、/shmid=shmget(MY_KEY,MY_SIZE,IPC_CREATE);char*p=(char*)shmat(shmid,0,0)/*此时p也指向该共享内存的起始地址,同样地,通过信号量或锁,占住该资源后,即可往该内存里读、写*/.shmdt(p);/*释放信号量或锁*/两个进程经过shmat、shmdt后,该内存的引用计数显然是0,但该内存仍然不会被释放。但进程1、2任意一个调用shmctl(shmid,IPC_RMID,%.d:%.c-rm$(CC)-M$(CPPFLAGS)$.$seds,($*).o:*,1.o$:,g$-rm$.$,Make,通过obj-y,得到需要编译的

15、所有.c文件,在Cavium上是分散在kernel各子目录下的Makefile文件中-include$(obj-y:.c=.d)首先把各个文件的后缀由.c变成.d,再include进来;前面加-,表示即使文件不存在,也不报错退出.PHONY:allall:;摆设而已,Make总需要一个target来执行,Make,%.d:%.c-rm$(CC)-M$(CPPFLAGS)$.$seds,($*).o:*,1.o$:,g$-rm$.$告诉Make,这是一个自定义的静态规则模式,.d文件如何从.c文件推导出来,并且通过sed命令把gccM生成的xxx.c:xxx.h.改成xxx.oxxx.d:xxx.h.,Make,seds,($*).o:*,1.o$:,g$:输出重定向到$文件s:s/pattern/replacement,s后面的第一个字符作为分隔符pattern:($*).o:*,:(、)成对括起来的字符,在replacement里可以用1、2来引用.0:作转字字符用,.正常为正规则表达式里的任意字符,相当于ls里的?,这里.0相当于正常的.o:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论