Boost 在两个进程(C 和 C++)之间的 managed_shared_memory 用法
Boost's managed_shared_memory usage in between two processes (C and C++)
我在使用 Boost managed_shared_memory
时遇到 Design/Implementation 问题。
问题
我有两个进程:Writer
和 Reader
。
这里 Writer
是一个 C++ 可执行文件,它使用 boost 写入共享内存。写法代码截图:
shm_controller.reset(new boost::interprocess::managed_shared_memory( boost::interprocess::open_or_create, shmName, size));
void * addr = shm_controller->allocate(size) ;
shm_controller->deallocate(addr);
一旦我有了addr指针,我就使用memcpy
在SHM中写入。
另一方面,我有 Reader
,它是 C 可执行文件。他们都通过消息传递应用程序进行通信。我这样写 Reader
代码:
Writer
正在传递存储在 "addr" 中的地址(从上面的代码快照)到 Reader
.
- 一旦
Reader
收到地址和大小,我将使用 memcpy
从 Reader
的局部变量写入 SHM 数据。
Note 1: (This Reader
is not using any boost shm API, as it's C application )
Note 2: I validated address is same on Writer
and Reader
(after communication).
但是 Reader
读取 shm 数据的 memcpy
导致我的可执行文件 (Reader
) 崩溃。
问题
- 我们可以在 C 中使用
boost::interprocess::managed_shared_memory
吗??
- 上面的实现有没有问题。 (
Reader
无法通过指针访问 Writer
的 shm)
- 有没有办法像任何包装器实现等一样解决此 C 和 C++ 限制
Q. Can we use boost::interprocess::managed_shared_memory in C ??
没有。从技术上讲,你当然可以(C 是图灵完备的),但它不受支持。
Q. Is there any implementation problem in above section. (can't a reader access shm of writer via pointer)
是的,您不能有效地将指针从一个进程传递到另一个进程,因为它们具有隔离地址 space。
Q. Is there a way to solve this C and C++ limitation like any wrapper implementation etc.
通常的方法是将数据作为消息的一部分在进程之间传递。使用您的消息传递库(http://man7.org/linux/man-pages/man7/mq_overview.7.html, http://zeromq.org/,等等)。
注意:这也避免了同步访问共享内存的麻烦,您甚至没有谈到。这让我想到了你没有想到的想法
下一个最好的想法是在两侧使用原始 shm API 并将 offset 跨进程传递到共享内存区域。如果您限制自己使用,例如,您仍然可以使用 BIP。 shared_memory_object
and e.g. offset_ptr
我在使用 Boost managed_shared_memory
时遇到 Design/Implementation 问题。
问题
我有两个进程:Writer
和 Reader
。
这里
Writer
是一个 C++ 可执行文件,它使用 boost 写入共享内存。写法代码截图:shm_controller.reset(new boost::interprocess::managed_shared_memory( boost::interprocess::open_or_create, shmName, size)); void * addr = shm_controller->allocate(size) ; shm_controller->deallocate(addr);
一旦我有了addr指针,我就使用
memcpy
在SHM中写入。另一方面,我有
Reader
,它是 C 可执行文件。他们都通过消息传递应用程序进行通信。我这样写Reader
代码:Writer
正在传递存储在 "addr" 中的地址(从上面的代码快照)到Reader
.- 一旦
Reader
收到地址和大小,我将使用memcpy
从Reader
的局部变量写入 SHM 数据。
Note 1: (This
Reader
is not using any boost shm API, as it's C application )
Note 2: I validated address is same onWriter
andReader
(after communication).
但是 Reader
读取 shm 数据的 memcpy
导致我的可执行文件 (Reader
) 崩溃。
问题
- 我们可以在 C 中使用
boost::interprocess::managed_shared_memory
吗?? - 上面的实现有没有问题。 (
Reader
无法通过指针访问Writer
的 shm) - 有没有办法像任何包装器实现等一样解决此 C 和 C++ 限制
Q. Can we use boost::interprocess::managed_shared_memory in C ??
没有。从技术上讲,你当然可以(C 是图灵完备的),但它不受支持。
Q. Is there any implementation problem in above section. (can't a reader access shm of writer via pointer)
是的,您不能有效地将指针从一个进程传递到另一个进程,因为它们具有隔离地址 space。
Q. Is there a way to solve this C and C++ limitation like any wrapper implementation etc.
通常的方法是将数据作为消息的一部分在进程之间传递。使用您的消息传递库(http://man7.org/linux/man-pages/man7/mq_overview.7.html, http://zeromq.org/,等等)。
注意:这也避免了同步访问共享内存的麻烦,您甚至没有谈到。这让我想到了你没有想到的想法
下一个最好的想法是在两侧使用原始 shm API 并将 offset 跨进程传递到共享内存区域。如果您限制自己使用,例如,您仍然可以使用 BIP。 shared_memory_object
and e.g. offset_ptr