linux课程设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Linux课程设计报告专业班级:学号:姓名:使用共享内存来完成进程间通信一、相关原理介绍分析1,共享内存的三种实现方式(1)POSIX共享内存对象:shm_open创建一个名称为tmp的共享内存区对象后,在/dev/shm/下可以看到对应的文件(tmpfs的文件系统可以看成是直接对内存操作,速度非常快)。cat可以看到映射的内容。进程重启共享内存中数据不会丢失,内核自举或显示调用shm_unlink或rm掉文件删除后丢失(2)POSIX文件映射:通过映射一个普通文件(匿名文件或一个打开的命名文件)实现共享内存——mmap()。该方式的特点接口简单,较通用。可利用cat查看映射的文件,要注意考虑进程终止对通信的影响。该方式也是本实验使用的方式,下面将做具体表述。(3)systemV共享内存:通过映射特殊存储块shm中的文件实现进程间的共享内存通信——主要有以下几个API:shmget()、shmat()、shmdt()及shmctl()。本方式无法看到文件实体。进程重启共享内存中数据不会丢失,内核自举或显示调用shmdt或使用ipcrm删除后丢失。2,POSIX文件映射共享内存简介POSIX文件映射指mmapmmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。3,POSIX文件映射共享内存实现方法(1)文件与address_space结构的对应:一个具体的文件在打开后,内核会在内存中为之建立一个structinode结构,其中的i_mapping域指向一个address_space结构。这样,一个文件就对应一个address_space结构,一个address_space与一个偏移量能够确定一个pagecache或swapcache中的一个页面。因此,当要寻址某个数据时,很容易根据给定的文件及数据在文件内的偏移量而找到相应的页面。(2)进程调用mmap()时,只是在进程空间内新增了一块相应大小的缓冲区,并设置了相应的访问标识,但并没有建立进程空间到物理页面的映射。4,主要函数介绍:(1)void*mmap(void*addr,size_tlen,intprot,intflags,intfd,off_toffset)①返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址②addr指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。③len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。④prot参数指定共享内存的访问权限。PROT_READ(可读),PROT_WRITE(可写),PROT_EXEC(可执行),PROT_NONE(不可访问)。⑤flags由以下几个常值指定:MAP_SHARED,(与private选择其一)MAP_PRIVATE,MAP_FIXED,(不推荐使用)⑥fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射⑦offset参数一般设为0,表示从文件头开始映射。(2)intopen(constchar*pathname,intflags,mode_tmode);①pathname指向欲打开的文件路径字符串。②flags所能使用的旗标:O_RDWR以可读写方式打开文件。O_CREAT若欲打开的文件不存在则自动建立该文件。O_TRUNC若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。③Mode有多种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。S_IRWXG00777,代表具有可读可写可操作二,设计实现1,功能介绍实现了共享内存机制。在一个终端上运行writer端,由于writer端得程序设置了八个缓冲区,因此可以依次输入,在另一个终端上运行reader端,在reader端可以读到数据并且屏幕输出。实现了信号量同步机制。程序中应用了信号量,reader端和writer端不能同时对同一缓冲区进行操作。2,程序结构框图3,程序代码(1)写者程序:w.c#defineNRBUF8//设置常数缓冲区的个数intempty[NRBUF];intmain(){/*数据结构的声明*/inti=0,fd;structbuffer_head*buf;w.cr.cmysemop.hmysemop.cfd();打开文件mmap()初始化缓冲区获得首地址While循环{Psem();写缓冲区Vsem();}文件While循环{Psem();读缓冲区Vsem();}fd();打开文件mmap()初始化缓冲区获得首地址12345structbuffer_headbu[NRBUF];chartemp[20];fd=open(arg,O_CREAT|O_RDWR|O_TRUNC,00777);//打开文件truncate(arg,sizeof(bu));//实际分配内存空间buf=(structbuffer_hea*)mmap(NULL,sizeof(bu),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//非配缓冲区close(fd);//关闭文件/*初始化信号量*/for(i=0;iNRBUF;i++){empty[i]=CreateSem(1);//产生信号量}/*初始化缓冲区*/intk=0;for(k=0;kNRBUF-1;k++){//(bu)-data=NULL;(buf+k)-b_next=buf+k+1;(buf+k)-sem=empty[k];(buf+k)-lo=k+1;}(buf+NRBUF-1)-b_next=buf;(buf+NRBUF-1)-sem=empty[NRBUF-1];(buf+NRBUF-1)-lo=NRBUF;i=0;while(1){/*进行PV操作*/Psem(buf-sem);printf(writer缓冲区%d:,buf-lo);printf(请输入一个字符串);gets(temp);memcpy(buf-data,temp,20);//内存拷贝buf=buf-b_next;}}(2)读者程序:r.c#defineNRBUF8//缓冲区个数intempty[NRBUF];//数组,存放信号量值intmain(){/**/inti=0,fd;/*结构的声明*/structbuffer_head*buf;structbuffer_headbu[NRBUF];chartemp[20];fd=open(arg,O_CREAT|O_RDWR,00777);//打开文件buf=(structbuffer_head*)mmap(NULL,sizeof(bu),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//分配缓冲区close(fd);structbuffer_head*re;re=buf;while(1)//做循环操作,依次从缓冲区读取内容,{Psem((re+i)-sem);//首先进行P操作,如果缓冲区正内进行操作则等待printf(Reader缓冲区%d:,(re+i)-lo);printf(%s\n,(re+i)-data);Vsem((re+i)-sem);\i=++i%NRBUF;sleep(3);}}Mysemop.hintCreateSem(intvalue);intSetSemValue(intsem_id,intvalue);voidDeleteSem(intsem_id);/*PV*/intPsem(intsem_id);intVsem(intsem_id);/**/#endif三、测试与总结1,编译过程与运行(1)开启两个终端一和二,cd进入到程序文件夹下,分别执行gccmysemop.hmysemop.c–oww.cgccmysemop.hmysemop.c–orr.c(2),在两个终端上各自运行./w和./r,则会出现以下界面(3)在终端一上的提示处输入随意字符,则在终端二会得到相应的输出(4)终端一中依然会提示输入内容,因为一共有八个缓冲区,最后会出现循环缓冲区的问题3,出现的问题及解决办法(1)总线错误:该错误出现的原因是由内存未对齐的读和写导致的。出现在程序初运行时,出现的原因是,reader函数的open方法中flag多加了一个参数O_TRUNC,该参数的作用是,若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。所以经常出现,文件中已经写入了东西,但是进行读操作后,文件中的数据马上消失,并且读不出来,出现总线错误(2)段错误:该错误就是指访问的内存超出了系统所给这个程序的内存空间,经常出现在指针的问题上,由于对于指针的掌握较于薄弱。如对于字符类型,不能用“%d”来输出。即不同数据类型不能混用。还有就是MMap()函数的返回值需要进行强制转化,否则也会出现段错误。即出现段错误的地方多是指针操作的地方。4,总结:(1),基础知识掌握不够牢固,对于C语言的程序编写在之前没有深入研究过,用到的时候就捉襟见肘,作为一项基本的编程语言,以后还需要多加掌握。(2)对于linux的操作不够熟练,浪费了很多时间,以及在出现问题之后经常不知所措,不知道采取什么办法来解决,多加练习一些linux中的基本操作。(3),资料的贫乏,网上的知识重复量太大,输入一个关键词,不同的网站出来的竟然都是一样的文章,限制了资料的查询,说明在这方面的研究还较少。如果有基本辅导书进行帮助的话估计会好点!四,参考文献

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功