两个C ++应用程序共享Linux上的只读内存区域

时间:2010-01-18 05:43:55

标签: c++ sharing mmap

我有两个进程P1和P2。

我有一个名为“R”的大型只读资源,我希望P1和P2都可以访问。

R不仅仅是一个“平坦”的字节组;它是一堆相互指向的C ++对象。

我更希望P1和P2只共享R的一个副本 - 不知何故P1加载R进入内存区域(在P1和P2中在同一地址处进行mmaped),然后P1和P2都可以访问对象在R中作为C ++对象(没有竞争条件,因为所有都是只读的)。

任何人都熟悉如何做到这一点/陷阱?

4 个答案:

答案 0 :(得分:5)

实际上类似的东西是asked and solved before

最好的答案可能适合你: 使用boost interprocess library。虽然您仍然无法使用具有虚函数的对象(令人讨厌的vtable指针在共享内存问题之外),但它们确实有工具可以让您使用智能指针到共享内存中的其他对象,以及在共享内存中分配的自定义分配器用于创建std :: vector和std :: map objects。

答案 1 :(得分:1)

R中的对象如何相互指向?如果它“相对于当前对象”的位置,您可以使用shared memory。没有保证在同一地址位置的进程P1和P2内加载此共享内存。这就是为什么亲戚才有效。 既然你说过,他们都没有尝试修改它,只是从中读取,我猜你不需要使用信号量/互斥量来保护它。

答案 2 :(得分:1)

如果我理解了手册页,那么Linux mmap function似乎允许您将文件,共享内存或其他可映射的内容映射到特定虚拟地址的进程中提供有点可怕的声音MAP_FIXED选项。在手册页中搜索MAP_FIXED,你会发现很多警告(可能不支持,可能使malloc不再工作,等等)。但是如果你可以让它工作,共享对象可以互相指向。

答案 3 :(得分:0)

这很简单:

#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>

// ...

int fd = open("memfile.txt",O_RDWR);
struct stat info;
fstat(fd, &info);
void * page = mmap(0, info.st_size, PROT_READ , MAP_SHARED, fd, 0);

现在,您可以将存储在memfile.txt中的任何内容用作结构,并在进程之间共享。

注意正如其他人所说,你不能在这块内存中的对象之间使用指针。

这适用于OS X 10.4,但适用于任何符合BSD标准的系统。