【发布时间】:2014-06-27 07:45:52
【问题描述】:
对于那些熟悉进程间通信的人,我有一个简短的问题。
情况
- 我有一个程序(程序 A),我可以添加一些代码,但非常有限。这是生成大量数据的主程序。
- 数据的制定方式是有限的,所以我想创建第二个程序(程序B),因此需要从A到B获取数据。甚至有时会导致A运行一些没有返回值的函数。
- 我知道命名管道,但是我觉得它们可能很笨重? - 不确定 - 例如,我有以下担忧(可能没有根据):
- 数据流 => 转换为二进制 -> 将数据放入内存 -> 服务器读取 -> 转换为字符串 -> 通过可能的 switch 语句确定请求的内容 -> 获取请求的内容 -> 转换为二进制 -> 放置在内存中 -> 由客户端读取并转换为字符串/某种可接受的格式。
- 它必须在两边都使用基本的 switch 语句,如果您想要除字符串以外的其他信息格式,则需要考虑这一点
- 一条消息可能必须等待另一条消息完成,因此在同时调用大量消息时它可能会变慢? - 虽然不确定
- 其他进程间通信方法可能存在同样的问题。
-
我认为更好的解决方案是创建一个“对象” - 类。并在程序之间共享对象内存地址,从而理论上将A和B“合并”起来:
- 编码和解码等问题没有问题
- 数据只是通过调用函数来请求/调用。
- 函数返回正确的类型,无需确定正确的类型是什么(即 bool / int / string / double 等)
我知道这也有几个问题,即如果对象被主/另一个访问它的程序从内存位置删除。
问题
- 解决此问题的最佳方法是什么:
- C++ 中是否有一个调用选项允许我从内存地址写入和读取?在这一刻:
- 我可以访问 A 和 B 之间的同一个对象,但我不能写/读,因为这会引发异常。那么基本上我可以通过简单的调用或者读/写这个对象吗?
- 我知道 WriteProcessMemory 函数 - 但这不是我想要的 - 即,我不一定要更改内存值,只需访问来自 B 的数据/调用 A 将执行的操作。
- 有没有简单易行的方法?我知道一种叫做 boost 的东西,但对此一无所知 - 这是我最好的选择吗? -> 即我应该将此作为我的最佳解决方案进行调查吗?
提前感谢您对此问题的任何建议。
【问题讨论】:
-
“我知道一个叫做 boost”的东西。好的。但最好的办法是使用它:boost.org。还有……惊喜!有一些东西可以帮助您解决问题:Boost.Interprocess
-
你可以通过管道发送二进制数据就好了。事实上,对于操作系统来说,通过管道的是原始字节流。但是,您想使用正确的序列化格式。 “Cap'n Proto”怎么样,它对您的情况有好处,有线格式与内存中的数据相同。
标签: c++ pointers interprocess