Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1762959
  • 博文数量: 100
  • 博客积分: 10122
  • 博客等级: 上将
  • 技术积分: 4092
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-04 20:28
文章分类

全部博文(100)

文章存档

2010年(2)

2009年(28)

2008年(70)

我的朋友

分类:

2008-12-01 02:08:40

设想在一个进程中有这样的一个数据结构:

typedef struct {
    DATA data;
} A;

typedef struct {
    A *to_a;
} B;

struct {
    A a;
    B b;
} shm_data;

进程初始化的时候,执行:

shm_data.b.to_a = &shm_data.a;

并且,将 shm_data 至于共享内存中。

另外一个进程则通过共享内存 也获得了 shm_data 的指针, 可是这时 shm_data.b.to_a 的指针却很可能失效了,因为共享内存可能被映射到了不同的虚拟地址。

解决办法之一是, 在所有结构里,设置一个 origSelf 指正,比如:

typedef struct {
    void *origSelf;
    A *to_a;
} B;

初始化的时候设置为:
shm_data.b.origSelf = &shm_data.b;

那么,在另外一个虚拟空间里即可以通过 origSelf 来计算应该补偿的偏移量了:

#define RELOCATE_OBJECT (self, curobj, type)                    \
    ((type*)((unsigned char*)(curobj) +                         \
             ((unsigned char*)(self) - (unsignedchar*)((self)->origSelf))))

A* the_a = RELOCATE_OBJECT(&shm_data.b, shm_data.b.to_a, A)

阅读(1128) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~