下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、linux 进程间通信之共享内存作者:武汉华嵌嵌入式培训中心技术部共享内存区是可用 ipc 形式中最快的。一旦这样的内存区映射到共享它的进程的地址空间, 这些进程间数据的传递就不再涉及内核(这里说的不涉及内核的含义是: 进程不再通过执行任何进入内核的系统调用来彼此传递数据)。然而往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步,同步的方式有多种,比如:信号量、互斥锁等等。以下两图分别描述了读写消息时,一个要进入内核,而一个不进入内核的情况:对于 system v 共享内存区,内核维护如下的信息结构,它定义在头文件中:struct shmid_ds struct ipc_per
2、m shm_perm; /* operation permission struct */ size_t shm_segsz; /* segment size */ . . . ; 有了以上的知识, 那么如何来对共享内存进行操作呢,以下就开始讲解如何来操作:创建一个新的共享内存区,或者访问一个已存在的共享内存区。#include int shmget(key_t key, size_t size, into flag);size 以字节为单位指定内存区的大小。当实际操作为创建一个新的共享内存区时,必须指定一个不为0 的 size 值。如果实际操作为访问一个已存在的共享内存区,那么 size 应
3、为 0。oflag 为读写权限值的组合。它还可以与ipc_creat 或 ipc_creat|ipc_excl按位或。当实际操作为创建一个共享内存区时,该内存区被初始化为size 字节的 0。由 shmget 创建或打开一个共享内存区后,通过调用shmat 把它附接到调用进程的地址空间。#include void *shmat(int shmid, const void *shmaddr, int flag);shmid 是由 shmget返回的标识符。 shmat的返回值是所指定的共享内存区在调用进程内的起始地址。确定这个地址的规则如下:如果 shmaddr是一个空指针, 那么系统替调用者选
4、择地址。 (这个是推荐的方法)如果 shmaddr是一个非空指针,那么返回地址取决于调用者是否给flag参数指定了 shm_rnd: o如果没有指定 shm_rnd,那么相应的共享内存区附接到由shmaddr参数指定的地址;o如果指定了 shm_rnd,那么相应的共享内存区附接到由shmaddr参数指定的地址向下舍入一个shmlba 常值。当一个进程完成共享内存区的使用时,它可调用shmdt 断接这个内存区。#include int shmdt(const void *shmaddr);当一个进程终止时,它当前附接着的所有共享内存区都自动断接掉。注意:本函数调用并不删除所指定的共享内存区。sh
5、mctl 提供了对一个共享内存区的多种操作。#icnldue int shmctl(int shmid, int cmd, struct shmid_ds *buff);该函数提供了三个命令:ipc_rmid 从系统中删除由 shmid 标识的共享内存区并拆除它。ipc_set 给所描写的共享内存区设置其shmid_ds 结构的某些成员。ipc_stat 向调用者返回所指定共享内存区当前的shmid_ds 结构。以下是共享内存结合信号量进行操作的部份代码:发关进程的部份代码:/ 创建一个共享内存区if(shmid1 = shmget(shmkey1, max_sheare_mem_size,
6、ipc_creat|0666) 0) perror(shmget); / 把共享内存区附接到调用进程的地址空间if(sharmem = shmat(shmid1, null, 0) 0) perror(shmat); while(1) sem_p(semid1); /semid1进行 p 操作,保护共享区 memset(buff, 0, max_sheare_mem_size); printf(input ou want to say with you friend!n); fgets(buff, max_sheare_mem_size, stdin); if(strncmp(buff, qu
7、it, 4) /往共享内存区放入数据 strncpy(sharmem, buff, max_sheare_mem_size); sem_v(semid2); /semid2进行 v 操作,释放对共享区的保护 else strncpy(sharmem, buff, max_sheare_mem_size); sem_v(semid2); break; 接收进程部份代码:while(1) sem_p(semid2); /semid2进行 p操作,保护共享区 memset(buff, 0, max_sheare_mem_size); strncpy(buff, sharmem, max_sheare_mem_size); /从共享内存区取出数据 printf(receive from you friend : %sn, buff); if(!strncmp(buff, quit, 4) del_sem(semid1); del_sem(s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高产乳清酸和尿苷的大肠杆菌整合菌株的设计构建
- 广州塑料包装袋施工方案
- 奶茶学生营销方案
- 环氧树脂-氰酸酯树脂的共固化及复合材料的制备研究
- 校园营销成功方案
- 咨询公司小门头设计方案
- 临清二层轻钢房施工方案
- 兔子引流活动方案策划
- 新年药品营销方案
- 雨水处理施工方案百度
- 2025成人高考专升本《政治》试题及答案
- 公安执法执勤规范课件
- 2025年冠脉介入考试题库
- 2025年事业单位笔试-河北-河北放射治疗技术(医疗招聘)历年参考题库含答案解析(5卷套题【单选100题】)
- 《机械创新设计》课件-k第五章 机构组合与创新设计
- 创新委员管理办法
- (高清版)DBJ∕T 13-318-2025 《建筑施工盘扣式钢管脚手架安全技术标准》
- 国家开放大学《社会心理适应》形考任务1-7参考答案
- 法拉利介绍教学课件
- 2025至2030全球及中国固定线路宽带接入设备行业产业运行态势及投资规划深度研究报告
- 国企财产管理办法细则
评论
0/150
提交评论