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

标签 python c++ boost shared-memory

我在 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/

相关文章:

c++ - 使用匿名管道替代 PeekNamePipe() -- WIN32

c++ - 奇怪的编译错误 c++ opencv 2.4.10 在 ubuntu 14.04lts

c++ - 优化成员变量访问

c++ - 使用 boost 正则表达式时出现 shared_ptr 错误

c++ - 使用 boost::phoenix::bind 和 boost::spirit::qi::symbols::add

c++ - Boost::Asio聊天示例程序---如何实现私聊

python - 对 SQLAlchemy 中的 UniqueKeyViolation 使用react

python - 从 Cron Python/Google API 运行不会接受存储的凭据文件,但从命令行运行它会

python - 未定义的 boost python 符号:boost::python::detail::init_module

python - django:在添加新照片时删除以前的照片