我正在使用共享内存,我需要为我的程序提供几个指针,但我有限制只使用一个标识符:
int idSh;
int * mem;
char * mem2;
idSh = Shmget (IPC_PRIVATE, sizeof (char *) + sizeof (int *), IPC_CREAT | 0700);
mem = Shmat (idSh,0,0);
mem2 = Shmat (idSh,0,0);
我必须使用几个与Shmat的指针,但我只有一段共享内存,标识符为idSh。
任何解决方案?
答案 0 :(得分:0)
您需要将基于'指针的'数据结构重写为'基于偏移',并在共享内存对象的开头创建一种目录。该目录应标识根数据结构的偏移量,因此每个访问者都可以适应它映射到的任何地址。坏消息是它有很多繁琐的工作;好消息是它通常会使源基础变得更好。基于偏移量具有各种优势,例如能够拍摄整个数据结构的快照,以及编写可以离线分析它的实用程序。
基于偏移量:如果您在链接列表中有一个节点,如:
struct Node {
MyType Data;
struct Node *Link;
}
您需要将其更改为:
struct Node {
MyType Data;
uintptr_t Link;
}
然后走你的数据结构看起来像:
extern uintptr_t ShmemBase;
struct Node *Next = (struct Node *)(ShmemBase + Cur->Link);
虽然我敢打赌你可以更好地封装它,甚至可能将“链接”字段与特定的共享内存对象相关联。
我过去做过这些转换,它们通常没有你想象的那么糟糕。您确实对那些正确隐藏数据结构访问方法的人表示赞赏....
或者,系统通常可以强制映射到所有参与者的统一地址的映射对象;因此,如果您稍微使用目标系统,您可能会发现这些神奇的地址。最终,如果你走这条路,有人会恨你。