免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9161 | 回复: 11
打印 上一主题 下一主题

共享内存和结构体数组 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-13 13:33 |只看该作者 |倒序浏览
现有一结构

  1. struct A
  2. {
  3.     int a;
  4.     int b;
  5.     char x[32];
  6.     struct B *ok;
  7. };
  8. struct B
  9. {
  10.     int c;
  11.     int d;
  12.     int e;
  13.     char f[32];
  14.     char f[32];
  15. };
复制代码

现在声明了一个结构数组

  1. struct A hh[4];
复制代码

数组中的每一个结构都付了初值,
现在创建了一块共享内存,要求把上面的数据放进共享内存中去
怎么放???

  1. shmt = (struct A *)shmat(key,0,0);
  2. memcyp(shmt,hh,sizeof(struct A) * 4);
  3. 是这么放的吗???
复制代码

可是这样做了之后,只是放入了一个struct B *ok的指针,并没有放入 所指的数据

我该怎么做才能把struct B *ok所指的数据也放进去呢??
请大家帮我看看
谢谢了

论坛徽章:
0
2 [报告]
发表于 2005-12-13 13:56 |只看该作者
the 2nd argument of shmget() :          (sizeof(struct A) + sizeof(struct B) )* 4

这个问题与共享内存没关系,自己负责拷贝吧。

论坛徽章:
0
3 [报告]
发表于 2005-12-13 14:50 |只看该作者
谢谢
只是不是我问的问题的答案呢

我的这个struct B *ok;结构是想实现一个动态的数组
例如:hh[0].ok[1],hh[1].ok[3]等等
我现在用

  1. shmt = (struct A *)shmat(key,0,0);
  2. memcyp(shmt,hh,sizeof(struct A) * 4);
复制代码

考进数据后能访问strcut A 中的
这几个数据项
    int a;
    int b;
    char x[32];

但是不能通过ok指针访问
struct B中的数据项

我想了一下,是因为在struct A中 ok为struct B型的指针
所以考数据的时候只是考了这个指针,并没有考它所指向的那块数据

我想知道的是怎么把它所指向的那块数据也考进共享内存,访问的时候怎么访问呢?
谢谢

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-12-13 14:55 |只看该作者
把struct A ,struct B数据都copy进去.然后让ok指向struct B

论坛徽章:
0
5 [报告]
发表于 2005-12-13 15:01 |只看该作者
同意

论坛徽章:
0
6 [报告]
发表于 2005-12-13 15:01 |只看该作者
如果都有好几个struct A和struct B,在内存中都连续分布的,那么怎么确定位置呢
究竟哪个B是属于哪个A的呢

论坛徽章:
0
7 [报告]
发表于 2005-12-13 15:15 |只看该作者
这个是不现实的,你要创建shm,必须指定大小──当然,你也可以指定一个比需求大很多的size,以便动态分配。 但是, 想在shm中实现象C++ vector那样的东西,我觉得不太现实。

要不然就首先设定一个最大值, 按照这个标准来shmget。然后,拷贝就是了?(btw: 如果memcpy不会的话就不要问我了^_^)

论坛徽章:
0
8 [报告]
发表于 2005-12-13 15:56 |只看该作者
原帖由 mq110 于 2005-12-13 14:55 发表
把struct A ,struct B数据都copy进去.然后让ok指向struct B

共享内存里面用指针,每次shmat的挂接点都不一样,感觉没意义哦,

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2005-12-13 19:06 |只看该作者
原帖由 musg2000 于 2005-12-13 15:56 发表

共享内存里面用指针,每次shmat的挂接点都不一样,感觉没意义哦,


可能他就有这样的需求吧.
如果我可能换一种方式. 消息队列.或其他.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-12-13 19:10 |只看该作者
另外.如果共享内存只是 简单的copy一个指针过去.就可以随意访问的话,岂不是失去了保护性?
进程的地址空间随便就可以被其他进程访问.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP