注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

多多的爹

 
 
 

日志

 
 

读程序,学习Linux编程(四十一)  

2010-09-05 20:42:22|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

4.9. 共享内存

在3.10提到过共享内存,当时我就觉得那应该是共享内存文件才对。最近翻书,才发现那确实不应该被称作共享内存,因为Linux内另有一堆函数用来实现真正的共享内存:

#include

#include

int shmget(key_t key, size_t size, int shmflg); // 创建或者获得共享内存

void *shmat(int shmid, const void *shmaddr, int shmflg); // 返回共享内存地址

int shmdt(const void *shmaddr); // 关闭共享内存地址,进程不能再进行读写操作

int shmctl(int shmid, int cmd, struct shmid_ds *buf); // 设置共享内存,通常删除共享内存

因为是进程间通信用,这里分别描述主进程和次进程的使用过程,下面是主进程使用过程:

1. 用shmget创建一个共享内存。key设置成一个已经约定好的数值,记住千万千万不要用IPC_PRIVATE,用这个你必定失败。并且如果所有的进程都用IPC_PRIVATE,谁知道应该跟谁通信呢?shmflg设置成IPC_CREAT | IPC_EXCL | SHM_R | SHM_W。

2. 用shmat获得共享内存地址,第2、3个参数都设置为0就行了。

3. 读写完共享内存后,用shmdt关闭共享内存地址。

4. 完全不需要共享内存了,用shmctl删除,第二个参数cmd设置成IPC_RMID。注意,如果没有用shmctl删除共享内存,即使进程退出了,这段共享内存还是会存在。

次进程使用过程:

1. 用shmget获得共享内存,key是约定好的数值,shmflg设置成SHM_R | SHM_W。

2. 用shmat获得共享内存地址,第2、3个参数都设置为0就行了。

3. 读写完共享内存后,用shmdt关闭共享内存地址。

其实删除共享内存,主次进程都可以做,不过一般还是遵循谁创建谁删除的原则好。

  评论这张
 
阅读(5)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017