首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ctype从python访问boost::进程间共享内存块

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

Stack Overflow用户
提问于 2015-06-24 21:30:37
回答 1查看 2.4K关注 0票数 4

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

代码语言:javascript
运行
复制
#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];
};

作为:

代码语言:javascript
运行
复制
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)
    ]

我希望:

代码语言:javascript
运行
复制
shmem = mmap.mmap(-1, ctypes.sizeof(TransferData.TransferData), 
          "TransferDataSHMEM")
data = TransferData.from_buffer(shmem)

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

EN

回答 1

Stack Overflow用户

发布于 2015-06-24 21:30:37

我发现的诀窍实际上是在boost::interprocess这一端。而不是创建一个普通的共享内存区域:

代码语言:javascript
运行
复制
  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实现了这一点,但使用了替代shared_memory_object而不是默认的windows_shared_memory

工作代码如下:

代码语言:javascript
运行
复制
  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存储库。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31028012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档