我想在两个进程中共享 map 指针。所以我尝试了mmap。我在单个进程中测试了 mmap。这是我的代码:
#include <vector>
#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <cstdlib>
#include <stdio.h>
#include <map>
using namespace std;
int main(int argc, char *argv[])
{
map<string,string> a, *b;
b = (map<string,string> *)mmap(&a,sizeof(map<string,string>),
PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0);
b->insert(map<string,string>::value_type("a","b")); //error
cout << b->size() << endl;
}
运行到b->insert()
时,出现Segmentation failure。如果我删除 b->insert()
,则不会出现错误(仍然有 b->size
)。我的代码有什么问题?
最佳答案
尽管有它的名字,mmap()
与 std::map
无关。当您使用mmap()
时,您可以访问没有结构的原始内存块。您不能直接在该 block 中存储像 std::map
这样的 STL 对象,因为 STL 对象内部存在与 mmap()
不兼容的内部指针。
当您使用mmap()
将同一内存块映射到两个不同的进程时,该 block 甚至可能不会出现在内存中的同一地址。在定义将存储在共享内存中的数据格式时,必须考虑到这一点。
关于c++ - mmap() 后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6087274/