Unix - 共享内存

时间:2018-04-20 21:13:46

标签: c unix shared-memory

我正在使用共享内存,我需要为我的程序提供几个指针,但我有限制只使用一个标识符:

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。

任何解决方案?

1 个答案:

答案 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);

虽然我敢打赌你可以更好地封装它,甚至可能将“链接”字段与特定的共享内存对象相关联。

我过去做过这些转换,它们通常没有你想象的那么糟糕。您确实对那些正确隐藏数据结构访问方法的人表示赞赏....

或者,系统通常可以强制映射到所有参与者的统一地址的映射对象;因此,如果您稍微使用目标系统,您可能会发现这些神奇的地址。最终,如果你走这条路,有人会恨你。