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

下载本文档

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

文档简介

1、菲 菱 科 思 内 部 资 料 , 注 意 保 密菲 菱 科 思 内 部 资 料 , 注 意 保 密LinuxLinux编程知识编程知识主要内容 Linux编程的风格及与编程的风格及与COMWARE的比较的比较 Linux程序的常见概念程序的常见概念 Linux Make的使用的使用Linux编程的风格编程的风格变量类型:Linux的更直观:u_int32_t VS ULONG变量命名:Linux采用全小写,简短,但对英语要求较高COMWARE;采用的是匈牙利命名法,容易理解,但长度较长控制块的使用:COMWARE是强制要求if、else等后面必须有,不容易出错;而Linux是能不用则不用,且

2、尽量多容纳有效行函数返回值:功能性的函数,Linux一般是0返回正确,小于0的是出错;COMWARE是VOS_OK正确,VOS_ERR错误常数的使用:Linux使用常数的地方较多,需联系上下文才能看懂;COMWARE是提倡用有意义的宏来代替,能够顾名思义.Linux用的是最新gcc编译器,支持C99,可变宏、更多的关键字,等等,编码更灵活;COMWARE仅支持ANSI C89总之,Linux是天才们的编码,更追求技术;COMWARE是普通人的编码,更追求稳定Linux程序的常见概念程序的常见概念(一一)进程:亦可称为任务。Linux下的进程互不影响,各自使用独立的空间,由CPU、OS共同负责内

3、存保护、任务切换;COMWARE使用相同的地址空间,能够互相访问,因此也会发生踩内存的现象。COMWARE下启动任务是VOS_T_Create函数,通常是任务A调用该函数来启动B,两者代码通常不相同。Linux是fork函数来启动子进程。通常返回值PID来区分:1、返回值是0,则是子进程,子进程可以通过getpid来获取自身PID2、返回值是-1,表明创建任务出错3、其它,则是父进程,并得到了子进程的PIDLinux程序的常见概念程序的常见概念(一一)fork代码常见形式: . if ( (pid = fork() = 0 ) /* Child process */ else if (pid

4、= -1) /* Error Handler */ else /* Parent process */ .Linux程序的常见概念程序的常见概念(二二)线程:可以说是轻量级的进程。创建一个线程比创建一个进程的开销少得多。同一个进程下的线程可以共享父进程的所有资源,很方便地实现线程间的通讯。COMWARE不支持。Linux下用得也较少。Windows下用得最多。线程通常是用来UI和Function分离:主线程负责从图形化界面上接收用户的数据,并将其传给对应的子线程。子线程负责接收数据并计算,并将结果返回给主线程,由主线程显示给用户。好处:避免了长时间的计算,用户无法进行控制。缺点:编码时需要考虑

5、同步、互斥的问题。Miniware短时间内不会用到线程。有兴趣的可参考pthread_createLinux程序的常见概念程序的常见概念(三三)共享链接库:共享一份代码,数据各自独立,更常用的是COW-Copy on Write与可执行文件的区别:不能直接运行,不需要main函数编译共享链接库时,需要使用-fPIC和-shared别的程序要使用,编码时需要提供头文件,声明各函数;链接时,需要-L给出链接库的目录以及-l给出链接库的名称程序运行时,由OS负责装入-fPIC:Position-Independent Code:Access all constant addresses throug

6、h a Global Offset Table与静态库的区别:静态库的代码是编译链接时使用,而且用哪些链接哪些,使用一次链接一次,编译链接后直接存在于可执行文件中,类似于C语言中的#define;共享链接库是运行时加载,链接时放在可执行文件的是文件名和代码起始地址(或函数名),类似于C语言的函数调用Linux程序的常见概念程序的常见概念(三三)对于Miniware来说,静态库的代码已经是vmlinux.64文件中可执行文件的一部分;而共享链接库的代码则是vmlinux.64文件中不可执行的文件,放在ram fs,执行时才会用到。COMWARE没有共享链接库的说法。Linux还可以动态加载共享链

7、接库,但需要程序员的额外编码。避免了一开始就加载,但后续用不到的浪费(比如if分支加载不同的动态链接库)。Linux下是dlopen、dlsym;Miniware基本不需要用到该特性。Linux程序的常见概念程序的常见概念(四四)信号量:用于访问全局资源的互斥、进程间同步的手段。本质是非负的整数计数器。使用者在访问全局资源前,首先需要去获取一个信号,如果计数器大于0,则使用者可以获取成功;否则的话,使用者的任务将会被挂起;获取信号量成功后,可以开始访问全局资源;访问结束后,应当及时释放,使得在其上面阻塞的任务能够尽快得到调度。如果计数器初始化为1,且只有两个竞争者,则是互斥的典型现象。Linu

8、x程序的常见概念程序的常见概念(四四)sem_init:用于初始化一个信号量sem_wait:获取信号量,如果计数器当前大于0,则获取成功,否则任务被挂起sem_trywait:获取信号号,与sem_wait的区别是获取不成功,不会被挂起sem_post:释放信号量,访问全局资源后,应当及时释放上述函数仅用于Linux线程间的同步Linux程序的常见概念程序的常见概念(四四)semget:用于初始化一个信号量semop:操作一个信号量,获取还是释放semctl:控制一个信号量,通常初始化初值或者释放信号量所使用的内核资源上述函数可用于Linux进程间的同步Linux程序的常见概念程序的常见概念

9、(四四)#define MY_KEY 5555struct sembuf operation1 ;union semun int val; struct semid_ds *buf; USHORT *array; semctl_arg,ignored_argument;int semidsemid = semget(MY_KEY, 1, IPC_CREATE);/Set Initial value for the resource - initially one process ownedsemctl_arg.val = 1; /Setting semval to 1semctl(semid,

10、 0, SETVAL, semctl_arg);Linux程序的常见概念程序的常见概念(四四)/ get semaphoreoperation0.sem_op = -1;operation0.sem_num = 0;operation0.sem_flg = IPC_WAIT;semop(semid, operation,1);/ access global shared resource/ release semaphoreoperation0.sem_op = 1;operation0.sem_num = 0;operation0.sem_flg = IPC_WAITsemop(semid,

11、 operation,0);/ close semaphoresemctl(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_unlockLinux程序的常见概念程序的常见概念(四四)COMWARE由于任务是互斥的,通常不必

12、考虑互斥,进程间通信基本是基于消息队列Linux的System V是从Unix学习而来的,函数的控制参数多带有IPC字段Windows的对信号量、事件、互斥量等,函数名、函数参数上各自独立,有较好的理解性Linux程序的常见概念程序的常见概念(五五)共享内存:进程间通信的常用方法创建一块共享内存:int shmget(key_t key,int size,int shmflg);其中key必须是唯一,并且这组进程调用该函数时,key必须相同。否则的话,得到的共享内存,也许属于别的进程。shmflg通常是IPC_CREAT,表示不存在该共享内存时则创建,存在的话则去打开。除非失败,否则都会得到该

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

14、志为可移除int shmctl( int shmqid, int cmd, struct shmid_ds *buf )cmd为IPC_RMID,表示标志其为可移除Linux程序的常见概念程序的常见概念(五五)#define MY_KEY 55555#define MY_SIZE 2048/* Process 1 */shmid = shmget(MY_KEY, MY_SIZE, IPC_CREATE);char * p = (char *)shmat(shmid, 0, 0)/* 此时p指向该共享内存的起始地址,通过信号量或锁,占住该资源后,即可往该内存里读、写 */.shmdt(p);/*

15、 释放信号量或锁 */Linux程序的常见概念程序的常见概念(五五)/* Process 2 */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, &buf)后,该内存就

16、会被释放,其中buf对于IPC_RMID总被忽略小结和展望小结和展望多学习,多看源码.其实饿也不懂Make Linux下编译工程的好帮手,能够根据时间戳检测到哪些.c文件需要重新编译,链接 target . : prerequisites .command. 其中target、prerequisites可以是一个或多个file,都支持通配符,比如%.c表示以.c结束的文件名Make command前必须有一个t,否则的话,Make会报错;同时command必须是shell命令 target、prerequisites、command都支持变量 Make还支持include,跟C语言类似;如果i

17、nclude的文件是一个target,那么target被更新后,这个文件还会被重新include进来Make Make支持变量,除在command外可以任意定义,用$(variable)即可得到变量值 内建的函数,比如wildcard,patsubst等等 还支持shell函数,调用shell命令,将其结果赋给变量,相当于平时在shell运行命令,得到的结果由输出到屏幕变为赋值给变量Make gcc的-M命令,可以知道该.c文件依赖于哪些.h文件 这些头文件包括标准的头文件及用户自定义的头文件 如果编写的是用户态程序,可以使用-MM命令来得到依赖于哪些用户自定义的头文件Make 对于特殊后缀名

18、的文件,Make有其内建的目标依赖规则 比如.o文件 %.o : %.c$(CC) -c $(CFLAGS) $ -o $ 我们可以添加自己的目标依赖规则 %.d : %.ccommandMake Cavium上的makefile,与我们以前ARX9上的makefile大相径庭,不需要告诉make,这个.c文件依赖于哪个.h文件,也不需要告诉如何编译这个.c文件 这就是Make的魅力Make Cavium上自动编译的Make简化版: obj-y += -include $(obj-y:.c=.d) .PHONY: all all: ; %.d: %.c-rm $(CC) -M $(CPPFLAGS) $ $.$sed s,($*).o :*,1.o $ : ,g $-rm $.$Make 通过obj-y,得到需要编译的所有.c文件,在Cavium上是分散在kernel各子目录下的Makefile文件中 -include $(obj-y:.c=.d)首先把各个文件的后缀由.c变成.d,再include进来;前面加-,表示即使文件不存在,也不报错退出 .PHONY: all all: ; 摆设而已,Make总需要一个

温馨提示

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

评论

0/150

提交评论