linux课程设计_第1页
linux课程设计_第2页
linux课程设计_第3页
linux课程设计_第4页
linux课程设计_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、linux课程设计Linux课程设计报告专业班级:学号:姓名:使用共享内存来完成进程间通信一、 相关原理介绍分析1, 共享内存的三种实现方式(1) POSIX共享内存对象 :shm_open创建一个名称为tmp的共享内存区对象后,在/dev/shm/下可以看到对应的文件(tmpfs的文件系统可以看成是直接对内存操作,速度非常快 )。cat可以看到映射的内容。进程重启共享内存中数据不会丢失,内核自举或显示调用shm_unlink或rm掉文件删除后丢失 (2) POSIX文件映射:通过映射一个普通文件(匿名文件或一个打开的命名文件)实现共享内存mmap()。该方式的特点接口简单,较通用。可利用ca

2、t查看映射的文件,要注意考虑进程终止对通信的影响。该方式也是本实验使用的方式,下面将做具体表述。(3) systemV共享内存:通过映射特殊存储块shm中的文件实现进程间的共享内存通信主要有以下几个API:shmget()、shmat()、shmdt()及shmctl()。 本方式无法看到文件实体。进程重启共享内存中数据不会丢失,内核自举或显示调用shmdt或使用ipcrm删除后丢失。 2, POSIX文件映射共享内存简介 POSIX文件映射指mmapmmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不

3、必再调用read(),write()等操作。3,POSIX文件映射共享内存实现方法(1)文件与address_space结构的对应:一个具体的文件在打开后,内核会在内存中为之建立一个struct inode结构,其中的i_mapping域指向一个address_space结构。这样,一个文件就对应一个address_space结构,一个address_space与一个偏移量能够确定一个page cache 或swap cache中的一个页面。因此,当要寻址某个数据时,很容易根据给定的文件及数据在文件内的偏移量而找到相应的页面。(2)进程调用mmap()时,只是在进程空间内新增了一块相应大小的缓

4、冲区,并设置了相应的访问标识,但并没有建立进程空间到物理页面的映射。4,主要函数介绍:(1) void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset ) 返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址 addr指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。prot 参数指定共享内存的访问权限。 PROT_READ(可读) , PRO

5、T_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)。flags由以下几个常值指定: MAP_SHARED , (与private选择其一) MAP_PRIVATE , MAP_FIXED,(不推荐使用)fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射offset参数一般设为0,表示从文件头开始映射。(2) int open( const char * pathname,int flags, mode_t mode); pathname 指向欲打开的

6、文件路径字符串。 flags 所能使用的旗标:O_RDWR 以可读写方式打开文件。O_CREAT 若欲打开的文件不存在则自动建立该文件。O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。Mode有多种组合, 只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。S_IRWXG 00777,代表具有可读可写可操作二,设计实现1, 功能介绍实现了共享内存机制。在一个终端上运行writer端,由于writer端得程序设置了八个缓冲区,因此可以依次输入,在另一个终端上运行rea

7、der端,在reader端可以读到数据并且屏幕输出。实现了信号量同步机制。程序中应用了信号量, reader端和writer端不能同时对同一缓冲区进行操作。2, 程序结构框图 54321 文件While循环Psem();读缓冲区Vsem();While循环Psem();写缓冲区Vsem();fd ();打开文件mmap()初始化缓冲区获得首地址fd ();打开文件mmap()初始化缓冲区获得首地址3,程序代码(1)写者程序: #define NRBUF 8 w 和 ./r ,则会出现以下界面(3)在终端一上的提示处 输入 随意字符,则在 终端二会得到相应的输出(4)终端一中依然会提示输入内容,

8、因为一共有八个缓冲区,最后会出现循环缓冲区的问题3, 出现的问题及解决办法(1) 总线错误:该错误出现的原因是由内存未对齐的读和写导致的。出现在程序初运行时,出现的原因是,reader 函数的open 方法中flag多加了一个参数O_TRUNC ,该参数的作用是,若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。所以经常出现,文件中已经写入了东西,但是进行读操作后,文件中的数据马上消失,并且读不出来,出现总线错误(2) 段错误:该错误就是指访问的内存超出了系统所给这个程序的内存空间,经常出现在指针的问题上,由于对于指针的掌握较于薄弱。如 对于字符类型,不能用“%d”来输出。即不同数据类型不能混用。还有就是MMap()函数的返回值需要 进行强制转化,否则也会出现段错误。即出现段错误的地方多是 指针操作的地方。4, 总结:(1),基础知识掌握不够牢固,对于C语言的程序编写 在之前没有 深入研究过,用到的时候就捉襟见肘,作为一项基本的编程语言,以后还需要多加掌握。(2)对于linux的操作不够熟练,浪费了很多时间,以及在出现问题之后经常

温馨提示

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

评论

0/150

提交评论