通过内存共享C ++对象

时间:2014-06-27 07:45:53

标签: c++ pointers interprocess

对于那些熟悉进程间通信的人,我有一个简单的问题。

场合

  • 我有一个程序(程序A),我可以添加一些代码,但非常有限。这是生成大量数据的主程序。
  • 数据的制定方式是有限的,所以我想创建第二个程序(程序B),因此需要从A到B获取数据。甚至有时会导致A运行一些没有返回值的函数。
  • 我知道有名的管子,不过我觉得它们可能很笨重? - 不确定 - 例如我有以下问题(可能没有根据):
    1. 数据流=>转换为二进制 - >将数据放入内存 - >服务器读 - >转换为字符串 - >通过可能的switch语句确定所请求的内容 - >得到所要求的 - >转换为二进制 - >放在记忆中 - >由客户端读取并转换为字符串/某种可接受的格式。
    2. 它必须在两侧使用基本的switch语句,如果你想要一个不同于string的信息格式,你需要考虑到这一点
    3. 一条消息可能要等待另一条消息完成,所以在同时多次调用它时它可能会变慢? - 虽然不确定
  • 其他进程间通信方法可能存在同样的问题。
  • 我认为更好的解决方案是创建一个"对象" - 上课并在程序之间共享对象存储器地址,从而在理论上"合并" A和B然后:

    1. 编码和解码问题等没有问题
    2. 通过调用函数简单地请求/调用数据。
    3. 该函数返回正确的类型,无需确定正确的类型(即bool / int / string / double等)
    4. 据我所知,这也存在一些问题,即如果对象被访问它的主要/另一个程序从内存位置删除。

问题

  • 解决这个问题的最佳方法是什么:
  • C ++中是否有一个invoke选项允许我从内存地址写入和读取?在这一刻:
    1. 我可以在A和B之间访问相同的对象,但是我不能写/读,因为这将引发异常。那么基本上我可以通过简单的调用来读/写这个对象吗?
    2. 我知道WriteProcessMemory函数 - 但这不是我想要的 - 也就是说,我不一定想要更改内存值,只是访问A将执行的B中的数据/调用操作。
  • 这样做有简单易行的方法吗?我知道一些叫做提升的东西,但对此一无所知 - 这是我最好的选择吗? - >即我应该将此调查作为我的最佳解决方案吗?

提前感谢您就此问题提出任何建议。

3 个答案:

答案 0 :(得分:1)

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;
}

答案 1 :(得分:1)

简化!

一般来说,shared state可能是一个坏主意,不会很好地测试,并且可能会像global variables那样造成无法管理的严重架构的破坏。

ØMQ guide可能会帮助您掌握可能的解决方案。通常,如果您没有特殊要求,请使用消息传递。 ØMQ“套接字”速度快,非常健壮,只需很少的代码即可开始使用。

更新:readymade:msgpack-rpcprotobuf-remote

答案 2 :(得分:0)

您是为客户制作软件,还是仅为自己进行数据分析?如果只是为了您自己,您可以将数据写入硬盘,并将分析分为两个步骤。