【问题标题】:Using mmap with C++ and dynamic containers将 mmap 与 C++ 和动态容器一起使用
【发布时间】:2020-10-07 09:37:53
【问题描述】:

我正在尝试使用mmap 在我的设备上的进程之间映射和共享数据。我的目标是运行嵌入式 Linux 的嵌入式设备

我的流程是使用 C++ 实现的,并使用诸如 std::liststd::map 之类的容器。显然,容器的大小随着程序的运行而变化。

如果我使用在进程之间共享的结构,例如:

struct MYSTRUCT
{
    int val1;
    int val2;
    list <int> list1;
};

MYSTRUCT myStruct;

// later as the program runs for example...
myStruct.list1.push_back(100);

然后我想使用 mmap 来映射它。 mmap 的 API 如下:

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

对于length参数,我可以使用sizeof(myStruct) + myStruct.list1.size()吗?

【问题讨论】:

  • 查看 Boost.Interprocess。

标签: c++ linux ipc shared-memory mmap


【解决方案1】:

对于长度参数,我可以使用 sizeof(myStruct) + myStruct.list1.size() 吗?

不,因为:

  1. list.size() 是列表中元素的count。您需要list.size() * sizeof(int) 来存储裸元素,但这并不能说明list 本身的存储或其节点开销...

  2. 您可能无论如何都无法访问列表的内部节点类型,因此您无法为list.size() * sizeof(list&lt;int&gt;::node_type) 或其他任何内容保留空间

  3. 即使可以,节点通常也会包含指针,因此除非您能保证它们被映射到完全相同的地址,否则它们将无法在另一个进程中使用

  4. 如果你能做到,你还需要提供一个自定义分配器,它知道它应该首先在共享内存中分配节点(你不能只是memcpy链接就好像它是一个连续的数据块一样列出)

tl;dr你不能用标准库类型真正做到这一点。要么使用 Boost.Interprocess,要么将数据序列化到共享内存中,或者首先将其存储在共享内存中的平面 POD/普通布局中。

【讨论】:

    猜你喜欢
    • 2011-09-24
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2010-12-31
    • 2014-03-10
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多