gpt4 book ai didi

c++ - 通过内存共享 C++ 对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:03 26 4
gpt4 key购买 nike

我有一个简短的问题要问那些熟悉进程间通信的人。

情况

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

    1. 没有编码和解码问题等问题
    2. 只需通过调用函数来请求/调用数据。
    3. 该函数返回正确的类型,无需确定正确的类型(即 bool/int/string/double 等)

    我知道这也有几个问题,即如果对象被主程序/访问它的另一个程序从内存位置删除。

问题

  • 解决这个问题的最佳方法是什么:
  • C++ 中是否有调用选项允许我写入和读取内存地址?在这一刻:
    1. 我可以访问 A 和 B 之间的同一个对象,但我不能写/读,因为那样会引发异常。那么基本上我可以通过简单的调用或者读/写这个对象吗?
    2. 我知道 WriteProcessMemory 函数 - 但这不是我想要的 - 即我不一定要更改内存值,只是访问数据/从 B 调用 A 将执行的操作。
  • 有没有一种简单易行的方法可以做到这一点?我知道一种叫做 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;
}

关于c++ - 通过内存共享 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24446574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com