共享内存

3 篇文章 0 订阅

进程间通信知识了解不少,今天第一次正式使用,就出问题了。

这里选用的是共享内存存储数据,共享数据为一数组,大小动态分配,使用文件映射内存供不同进程进行访问。

因为数组大小动态分配,在内存中存储有两个辅助数据,数组大小和当前使用大小,结构如下:

 

在分配内存时,大小增加一个sizeof(struct SharedArray)用于存储附加信息,然后把array指针指向后续内存的首部,用于存放数组数据。但在使用其他进程访问该内存时出现了段错误。

 

看看共享内存的原理,操作系统把一块公共的内存区域,映射到进程内存空间中,但映射的内存地址并不能保证映射后的地址一致性(其实一致的可能性很小,基本没有成功过),而此处array执行的地址为创建共享内存进程中正确的数组地址,在新的进程中就不对了。

 

因此在共享内存中,需要慎重使用指针变量。对于本文中的问题修改很简单,删除int *array,每次使用结构的地址跳过这些额外信息即可,可通过下面的宏函数得到数据域的指针。

 

#define SA_getArray(share) (int *)(((void *)share) + sizeof(struct SharedArray))

或者

#define SA_getArray(share) (int *)(share + 1)

参考资料:

Linux环境进程间通信(五): 共享内存(上)

共享内存的概念

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值