mmap中的c-Struct 上下文

mmap中的c-Struct 上下文,c,struct,mmap,C,Struct,Mmap,我想用mmap稍微修改一下就可以了。 我使用mmap作为整数数组,但现在我想了解mmap中存储了结构的底层 我无法确定在以下情况下如何使用内存: typedef struct{ int a[500]; char b[500]; }myStruct; 将使用POSIX共享内存(shm_open..)在磁盘上(比如/home/me/theMmap)而不是/dev/shm或任何tmpfs(这将导致myStruct在任何时候的确切大小,例如500*4+500=2500字节)保存在mmape

我想用mmap稍微修改一下就可以了。 我使用mmap作为整数数组,但现在我想了解mmap中存储了结构的底层

我无法确定在以下情况下如何使用内存:

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

假设我有:

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

问题 如果结构保持在同一主机上,那么以这种方式存储结构安全吗

在磁盘上的mmap文件中存储一个大的结构会使它能够延迟加载,而不会在加载时占用所有的ram吗?检索Polo.a[350],而不实际加载内存中的所有内容(当然是在虚拟内存中)

我在这里有点迷路了


谢谢

你有点困惑了
shm_open
主要用于在进程之间共享内存。如果您只想处理“持久性”内存
open
+
mmap
就是您想要的。

非常简单--您需要打开文件,确保文件足够大,然后调用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的定义并重新编译,或者将文件放在thumb驱动器上并移动到具有不同体系结构的其他机器上,那么您将遇到问题。

实际上,我希望能够以进程间方式共享它。谢谢