Unix——共享内存

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。

有什么解决办法吗?

您需要将“基于指针”的数据结构重写为“基于偏移量”,并在共享内存对象的开头创建一个目录。该目录应该标识根数据结构的偏移量,因此每个访问者都可以适应它映射到的任何地址。坏消息是需要做很多繁琐的工作。好消息是它通常会使源代码库变得更好。基于偏移量具有各种优势,例如能够对整个数据结构进行快照,并编写可以离线分析它的实用程序。

基于偏移量:如果您在链表中有一个节点,例如:

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

尽管我敢打赌您可以更好地封装它,甚至可以将“Link”字段与特定的共享内存对象相关联。

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

或者,通常可以强制系统在所有参与者的统一地址映射对象;因此,如果您对目标系统进行一些修改,您可能会发现这些神奇的地址。如果你走这条路,最终会有人讨厌你。