免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: clientwyc
打印 上一主题 下一主题

高手请进:一个有关于共享内存大小分配时出现的问题 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
11 [报告]
发表于 2004-09-29 12:05 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

[quote]原帖由 "clientwyc"]两个子段的读写是通过地址偏移来实现的[/quote 发表:

怀疑你的指向子段的指针值有问题,能看一下你是怎么给指针赋值的吗?

论坛徽章:
0
12 [报告]
发表于 2004-09-29 15:15 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

好的,但分配值小了(shmget()中的size)第一个段也有问题
locShmHdAttr = (SHMHEADattr *)shmat(glbShmBlk.shmIds[iBlockNo], 0, 0);
lTmpLastSize = inSize-sizeof(SEGHEADattr);
                        lTmpExecSize = lTmpLastSize%inEvenSize;
                        inSize -= lTmpExecSize;
                       
                        locShmHdAttr->;allocSize += inSize;
                        locShmHdAttr->;avaliableSize -= inSize;
                        *outAddr = locShmHdAttr + locShmHdAttr->;strShmSeg.lOffset;
*outAddr:为字段的首地址

论坛徽章:
0
13 [报告]
发表于 2004-09-29 15:18 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

inSize :子段的大小
locShmHdAttr:块头的结构
SEGHEADattr:字段头的结构
allocSize :块中已经分配的字节
avaliableSize :块中未分配的字节

论坛徽章:
0
14 [报告]
发表于 2004-09-29 15:20 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

locShmHdAttr->;allocSize = locShmHdAttr->;strShmSeg.lOffset
他两的值一样

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
15 [报告]
发表于 2004-09-29 15:32 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

locShmHdAttr是一个结构体指针,locShmHdAttr + locShmHdAttr->;strShmSeg.lOffset会指到哪里去呢?实际的内存偏移量为locShmHdAttr->;strShmSeg.lOffset * sizeof(SHMHEADattr),如果sizeof(SHMHEADattr)很大的话,outAddr 会指到你分配的空间外。
应改为:*outAddr = (char *)locShmHdAttr + locShmHdAttr->;strShmSeg.lOffset;

论坛徽章:
0
16 [报告]
发表于 2004-09-29 15:52 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

块头(结构1:1028字节)段头(结构2:141字节)段数据(结构3,个数由子段大小决定)段头(结构2)(结构4,个数由子段大,这里是20480字节)
结构是这样的
块头:SHMHEADattr  locShmHdAttr
段头:SEGHEADattr
为什么是:locShmHdAttr->;strShmSeg.lOffset * sizeof(SHMHEADattr),这样呢?

论坛徽章:
0
17 [报告]
发表于 2004-09-29 15:56 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

实际的内存偏移量为locShmHdAttr->;strShmSeg.lOffset * sizeof(SHMHEADattr),为什么是这样呢?
我分配一块内存(shmget()获得)后她里面存放的数据如下
块头(结构1:1028字节)段头(结构2:141字节)段数据(结构3,个数由子段大小决定)段头(结构2)(结构4,个数由子段大,这里是20480字节)
块头:SHMHEADattr  locShmHdAttr
段头:SEGHEADattr
好我先改成:*outAddr = (char *)locShmHdAttr + locShmHdAttr->;strShmSeg.lOffset;
试一下

论坛徽章:
0
18 [报告]
发表于 2004-09-29 16:11 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

To :
yuxh      
侠客
可以了,太高兴了,谢谢!!!!
谢谢!!!!!
就是改成你说的那样就可以了
为什么会这样呢?能说一下吗,有没有相关的资料看啊

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
19 [报告]
发表于 2004-09-29 16:16 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

指针的运算问题。
SHMHEAD  *locShmHdAttr;
locShmHdAttr是个指针,locShmHdAttr+1指向的是下一个结构体的位置,相当于&locShmHdAttr[1],locShmHdAttr+n就是&locShmHdAttr[n],偏移量就是n*sizeof(SHMHEAD)

论坛徽章:
0
20 [报告]
发表于 2004-09-29 16:23 |只看该作者

高手请进:一个有关于共享内存大小分配时出现的问题

哦,对啊,谢谢,这个问题搞了我差不多一个星期了,看来我的基础太差了, 有关指针这块的资料你有吗?你有MSN吗?可以加为好友吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP