我遇到以下问题,我知道我需要通过共享内存或网络套接字使用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是通过套接字吗?
答案 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中运行另一个。我猜他们以完全不同的方式分配内存,无法共享。