gpt4 book ai didi

python - 使用 ctypes 从 python 访问 boost::进程间共享内存块

转载 作者:太空宇宙 更新时间:2023-11-03 17:37:23 36 4
gpt4 key购买 nike

我在 Windows 上运行的 C++ 程序中有一个结构,我想使用 ctypes 通过 Python 中的共享内存来访问该结构。例如:

#define MAX_ENTITIES 30

struct State
{
double x;
double y;
double z;
};

struct Stat
{
unsigned int numAvailable;
unsigned int numUsed;
};

struct TransferData
{
double exLg;
float other;
unsigned int more;
int more2;
unsigned char next;
bool statusReady;

Stat status;
State entities[MAX_ENTITIES];
};

如:

import ctypes

MAX_ENTITIES = 30


class State(ctypes.Structure):
_fields_ = [
('x', ctypes.c_double),
('y', ctypes.c_double),
('z', ctypes.c_double)
]


class Stat(ctypes.Structure):
_fields_ = [
('numAvailable', ctypes.c_uint),
('numUsed', ctypes.c_uint)
]


class TransferData(ctypes.Structure):
_fields_ = [
('exLg', ctypes.c_double),
('other', ctypes.c_float),
('more', ctypes.c_uint),
('more2', ctypes.c_int),
('next', ctypes.c_ubyte),
('statusReady', ctypes.c_bool),
('status', Stat),
('entities', State * MAX_ENTITIES)
]

我希望:

shmem = mmap.mmap(-1, ctypes.sizeof(TransferData.TransferData), 
"TransferDataSHMEM")
data = TransferData.from_buffer(shmem)

将使数据成为 C++ 端所表示内容的共享内存镜像,但它全部为零。

最佳答案

我发现的技巧实际上是在 boost::interprocess 方面。而不是创建一个普通的共享内存区域:

  shared_memory_object shmem(open_or_create, "CppTransferDataSHMEM", read_write);
shmem.truncate(sizeof(TransferData));
mapped_region region(shmem, read_write);
TransferData* data = reinterpret_cast<TransferData*>(region.get_address());

Windows 上的 Python(使用 -1 文件描述符)要求将内存映射到页面文件。 Boost 可以实现这一点,但有替代方案 windows_shared_memory而不是默认的 shared_memory_object .

工作代码如下:

  windows_shared_memory shmem(create_only, "TransferDataSHMEM", 
read_write, sizeof(TransferData));
mapped_region region(shmem, read_write);
std::memset(region.get_address(), 0, sizeof(TransferData));

TransferData* data = reinterpret_cast<TransferData*>(region.get_address());

我用我的 complete example solution 创建了一个 github 存储库.

关于python - 使用 ctypes 从 python 访问 boost::进程间共享内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31028012/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com