对于那些熟悉进程间通信的人,我有一个简单的问题.
情况
>我有一个程序(程序A),我可以添加一些代码,但非常有限.这是生成大量数据的主程序.
>数据的制定方式是有限的,所以我想创建第二个程序(程序B),因此需要从A到B获取数据.甚至有时会导致A运行一些没有返回值的函数.
>我知道有名的管道,但我觉得它们可能很笨重? – 不确定 – 例如我有以下问题(可能没有根据):
>数据流=>转换为二进制 – >将数据放入内存 – >服务器读 – >转换为字符串 – >通过可能的switch语句确定所请求的内容 – >得到所要求的 – >转换为二进制 – >放在记忆中 – >客户端读取并转换为字符串/一些可接受的格式.
>它必须在两侧使用基本的switch语句,如果你想要一个不同于string的不同格式的信息,你需要考虑到这一点
>一条消息可能必须等待另一条消息完成,因此在同时多次调用它时它可能会变慢? – 虽然不确定
>其他进程间通信方法可能存在同样的问题.
>我认为更好的解决方案是创建一个“对象” – 类.并在程序之间共享对象内存地址,从而理论上“合并”A和B然后:
>编码和解码问题等没有问题
>通过调用函数简单地请求/调用数据.
>函数返回正确的类型,无需确定正确的类型(即bool / int / string / double等)
我知道这也有几个问题,即如果对象被访问它的主/另一个程序从内存位置移除.
题
>解决这些问题的最佳方法是什么:
> C中是否有一个调用选项,允许我从内存地址写入和读取?在这一刻:
>我可以访问A和B之间的同一个对象,但是我不能写/读,因为这将引发异常.那么基本上我可以通过简单的调用或者读/写这个对象吗?
>我知道WriteProcessMemory函数 – 但这不是我想要的 – 也就是说我不一定要改变内存值,只是从A将执行的B访问数据/调用动作.
>有一种简单易行的方法吗?我知道一些名为boost的东西,但对此一无所知 – 这是我最好的选择吗? – >即我应该调查这是我最好的解决方案吗?
提前感谢您对此问题的任何建议.
最佳答案
Boost.Interprocess有许多方法可以在进程之间共享数据,其中一种方法是
shared_memory
取自boost的示例,其中程序充当同一内存对象的服务器或客户端(取决于是否给出参数)
include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <cstring>
#include <cstdlib>
#include <string>
int main(int argc, char *argv[])
{
using namespace boost::interprocess;
if(argc == 1){ //Parent process
//Remove shared memory on construction and destruction
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
} remover;
//Create a shared memory object.
shared_memory_object shm (create_only, "MySharedMemory", read_write);
//Set size
shm.truncate(1000);
//Map the whole shared memory in this process
mapped_region region(shm, read_write);
//Write all the memory to 1
std::memset(region.get_address(), 1, region.get_size());
//Launch child process
std::string s(argv[0]); s += " child ";
if(0 != std::system(s.c_str()))
return 1;
}
else{
//Open already created shared memory object.
shared_memory_object shm (open_only, "MySharedMemory", read_only);
//Map the whole shared memory in this process
mapped_region region(shm, read_only);
//Check that memory was initialized to 1
char *mem = static_cast<char*>(region.get_address());
for(std::size_t i = 0; i < region.get_size(); ++i)
if(*mem++ != 1)
return 1; //Error checking memory
}
return 0;
}