在C ++和动态容器中使用mmap

问题描述

我正在尝试使用import sys from awsglue.utils import getResolvedOptions args = getResolvedOptions(sys.argv,['JOB_NAME','hello']) print("The value for hello is:",args['hello']) 在设备上的进程之间映射和共享数据。我的目标是运行嵌入式Linux的嵌入式设备

我的过程是使用C ++以及mmapstd::list之类的容器实现的。显然,程序运行时容器的大小正在改变。

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

std::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的API如下:

mmap

对于void *mmap(void *addr,size_t length,int prot,int flags,int fd,off_t offset); 参数,我可以使用length例如吗?

解决方法

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

否,因为:

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

  2. 您可能仍然无法访问列表的内部节点类型,因此您无法为list.size() * sizeof(list<int>::node_type)或其他任何空间保留空间

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

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

tl; dr ,您实际上无法使用标准库类型执行此操作。要么使用Boost.Interprocess,要么将数据序列化到共享内存中,或者首先将其存储在共享内存中的平面POD /平凡布局中。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...