问题描述
我正在尝试使用import sys
from awsglue.utils import getResolvedOptions
args = getResolvedOptions(sys.argv,['JOB_NAME','hello'])
print("The value for hello is:",args['hello'])
在设备上的进程之间映射和共享数据。我的目标是运行嵌入式Linux的嵌入式设备
我的过程是使用C ++以及mmap
和std::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()吗?
否,因为:
-
list.size()
是列表中元素的 count 。您可能需要list.size() * sizeof(int)
来存储裸元素,但这并不能解决list
本身或其节点开销的存储问题。 -
您可能仍然无法访问列表的内部节点类型,因此您无法为
list.size() * sizeof(list<int>::node_type)
或其他任何空间保留空间 -
即使可以,节点通常也会包含指针,因此除非您可以保证将它们映射到完全相同的地址,否则它们将无法在其他进程中使用
-
,如果您可以做到 ,还需要提供一个自定义分配器,该分配器首先知道应该在共享内存中分配节点(不能只是{{ 1}}的链接列表,就好像它是连续的数据块一样
tl; dr ,您实际上无法使用标准库类型执行此操作。要么使用Boost.Interprocess,要么将数据序列化到共享内存中,或者首先将其存储在共享内存中的平面POD /平凡布局中。