gpt4 book ai didi

c - Unix - 共享内存

转载 作者:行者123 更新时间:2023-11-30 16:32:54 24 4
gpt4 key购买 nike

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

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”字段与特定的共享内存对象相关联。

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

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

关于c - Unix - 共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49949801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com