设想在一个进程中有这样的一个数据结构:
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)
阅读(1120) | 评论(0) | 转发(0) |