【发布时间】:2013-12-12 19:47:54
【问题描述】:
我有以下问题,我知道我需要通过共享内存或网络套接字使用 IPC。
我有一个用 VS2010 编译的可执行文件(意味着一个单独的 .exe),它从某个地方获取数据,它应该使该数据可用于第二个可执行文件。
boost::interprocess::managed_shared_memory managed_shm(
boost::interprocess::open_or_create,
"MyMemBlock",
4000000);
第二个可执行文件是用 VS2012 编译的,应该接收该数据(或从内存中获取)并处理它。
// fails with a boost::interprocess::interprocess_exception
boost::interprocess::managed_shared_memory managed_shm(
boost::interprocess::open_only,
"MyMemBlock");
整个过程需要尽可能快。 使用相同的 Visual Studio 版本编译两个可执行文件不是一种选择,一个代码库仅使用 VS2010 编译,另一个仅使用 VS2012/2013 编译。
但是,我第一次尝试使用 boost::interprocess 没有用(第二个进程抛出 boost::interprocess::interprocess_exception),我不完全理解内存是如何共享的,或者更准确地说,共享内存信息如何从一个进程传递到另一个进程。第一个exe如何填充共享内存块的信息?它是否仅适用于 one 可执行文件中的多个进程?不是多个.exe?它是否必须是两个可执行文件使用的相同 boost DLL?我唯一的选择是 IPC via Sockets 吗?
【问题讨论】:
-
你的整个问题描述由两个词组成,“没用”。 (顺便说一句,最常见的共享内存程序是让一个进程在共享内存中存储一个普通指针,然后让另一个进程尝试取消引用它。很容易在没有意识到的情况下做到这一点。例如,你可以' t 将
std::string存储在共享内存中,因为它会这样做。) -
@DavidSchwartz 我在该函数抛出的第二个代码块中提到。不过,您必须向右滚动很多才能看到它。我更新了问题以使其更清楚。不过,我的主要问题是,这个共享内存 IPC 是否可以使用 2 个不同的可执行文件,这些可执行文件是用 2 个不同的 boost DLL 编译的。因为我无法想象第二个进程怎么可能找到第一个进程的内存。我能找到的所有示例都使用 one 生成两个不同进程的可执行文件。
-
我认为不同的 boost DLL 应该无关紧要,但是您的数据在共享内存中的结构方式肯定会。您不应尝试共享任何二进制数据结构,而应仅共享普通的可序列化数据或原始数据类型。
-
两个应用程序都有管理员权限吗?如果没有,试试吧!
-
实际上,我得到了它的工作。直到,你让我思考——我都尝试了管理员权限,但没有任何区别。但实际上一个应用程序使用的是 boost 1.53,另一个是 1.55。然后我在两者上都尝试了 1.53 - 繁荣,它奏效了。所以我真正的问题得到了我自己的回答,因为它有效:是的,IPC 不仅适用于 1 个可执行文件中的 2 个进程,而且适用于 2 个使用不同编译器、不同 libc、不同 boost DLL 的不同可执行文件,但它们必须使用相同的提升版本!
标签: c++ boost boost-asio boost-interprocess inter-process-communicat