IPC通过两个不同的可执行文件?

时间:2013-12-12 19:47:54

标签: c++ boost boost-asio boost-interprocess inter-process-communicat

我遇到以下问题,我知道我需要通过共享内存或网络套接字使用IPC。

我有一个可执行文件(意思是单独的.exe),用VS2010编译,从某个地方获取数据,它应该使这些数据可用于第二个可执行文件。

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如何填充共享内存块的信息?它是否只适用于一个可执行文件中的多个进程?不是多个.exe的?是否必须是两个可执行文件使用的相同的boost DLL?我唯一的选择IPC是通过套接字吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试本机Windows IPC。有很多你可以google them。我推荐Memory-mapped files。这里还有来自MS

的精彩文章

这是非持久存储器映射文件的示例场景。

1. Process A creates the memory-mapped file and writes a value to it.

2. Process B opens the memory-mapped file and writes a value to it.

3. Process C opens the memory-mapped file and writes a value to it.

4. Process A reads and displays the values from the memory-mapped file.

5. After Process A is finished with the memory-mapped file, the file is 
   immediately reclaimed by garbage collection.

取自here

Boost也有implementation of memory-mapped files,根据编译目标平台,它将使用原生低级API。示例代码可以采用here

答案 1 :(得分:1)

IPC适用于两种不同的可执行文件。访问共享内存的两个进程不需要编译到同一个可执行文件中。实际上,它们可以使用不同版本的visual studio和不同的boost DLL进行编译。但是,必须在两个可执行文件中使用相同的版本 boost。

非常有趣的是,什么也无效,是在release-build中运行一个可执行文件,在debug-build中运行另一个。我猜他们以完全不同的方式分配内存,无法共享。