c - mmap中的Struct

时间:2014-08-03 20:08:24

标签: c struct mmap

上下文

我认为用mmap破解一下会很好。 我使用mmap作为整数数组,但现在我想了解存储在mmap中的结构的基础。

我无法弄清楚当这个结构时将如何使用内存:

typedef struct{
   int a[500];
   char b[500];
}myStruct;

将使用磁盘上的POSIX共享内存(shm_open ..)保存在mmaped文件中(例如/ home / me / theMmap)而不是/ dev / shm或任何tmpfs(这将导致myStruct的确切大小)任何时候,例如500 * 4 + 500 = 2500字节)。

说我有:

myStruct Polo;

并希望在从mmap加载结构后使用Polo.a [350]。

问题

如果结构保留在同一主机上,那么存储结构是否安全?

将大型结构存储在磁盘上的mmap文件中是否可以延迟加载它而不是在加载时占用所有ram?并检索Polo.a [350]而不实际加载内存中的所有内容(当然在虚拟内存中)?

我在这里有点迷失。

由于

2 个答案:

答案 0 :(得分:3)

非常简单 - 您需要打开文件,确保它足够大,然后调用mmap:

int fd = open("/home/me/theMmap", O_RDWR|O_CREAT, 0660);
ftruncate(fd, sizeof(myStruct));
myStruct *Polo = mmap(0, sizeof(myStruct), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

这为您提供了一个指向包含myStruct对象的mmapped空间的指针,因此您可以将其作为
Polo->a[350]或其他任何内容进行访问。

您不必担心字节排序或结构打包等等,只要您在一台计算机上访问它,并使用相同的myStruct定义。如果您更改myStruct的定义并重新编译,或者将文件放在拇指驱动器上并将其移动到具有不同体系结构的其他计算机上,那么您将遇到问题。

答案 1 :(得分:2)

你有点困惑。 shm_open主要用于在进程间共享内存。如果你只是想处理"执行"记忆open + mmap就是你想要的。