通过 IPC 传递非 POD [普通旧数据类型]

Posted

技术标签:

【中文标题】通过 IPC 传递非 POD [普通旧数据类型]【英文标题】:Passing non PODs [ Plain old DataTypes ] over IPC 【发布时间】:2013-02-24 00:56:08 【问题描述】:

我正在编写 IPC 的实现。用户调用,我将所有这些参数传递给其他进程。

我已经为这些函数编写了一个基于逻辑的自动代码生成器,其工作原理如下:

    获取所有参数并将它们放入结构中。 添加 IPC 所需的其他信息。将此结构的大小和指针传递给 POSIX 消息队列。 从这个地址读取数据,直到指定的大小,然后发送到其他进程。 解构结构以获取参数。 使用这些参数调用实际函数。

当我只有普通的旧数据类型时,这非常有效。但是当函数参数是非 POD 时,我的逻辑失败了,因为:

    在非 POD 类型的情况下,我无法确定总数据的大小[消息队列需要] 某些类可能包含动态增加的实体,例如向量。

有人可以告诉我如何处理这种情况吗?

【问题讨论】:

阅读serialization。另见例如Boost serialization 或 Google Protocol Buffers. 我写了这个。 github.com/Loki-Astari/ThorsSerializer 它将 C++ 对象序列化为 Json(并反序列化它们)。不如 Google 的东西好,但使用起来非常简单。 @JoachimPileborg 我阅读了有关 Boost 序列化的信息。据我了解,数据被序列化成文件,然后反序列化。但是这个数据是写在硬盘上的!就速度而言,访问硬盘传输数据,对于 IPC 机制来说,这不是太多开销吗? Boost Serialization 中现有的归档类支持任何流,因此可以用于任何 C++ iostream(例如Boost ASIO ip::tcp::iostream)。 【参考方案1】:

您需要决定如何进行序列化。

例如您可以定义一个表示各方之间交换的消息的类型,然后实现一个将对象序列化为消息的通用函数。当你有自定义逻辑时,你专门化了序列化函数。

这是一些伪代码:

class Message ... // blah blah

// default imple
template<typename T>
Message& operator <<(Message& msg, T& t)  .. write it as a POD .. 

// specialize for types which need custom logic
Message& operator <<(Message& msg, SomeCustomType& x)  .. custom serialization ..

要反序列化,您需要对 operator &gt;&gt; 执行类似操作。然后你做:

Message msg;
MyType whatever = ...
msg << whatever;
// now send msg to other side.

当然,您需要在消息中包含一些元数据,以便您知道如何在另一端解包(即解包到哪种类型)。

有很多示例(例如 STL 流或 MFC 如何使用 CArchive 类和可序列化类型上的 Serialize 方法对其进行抽象)

【讨论】:

以上是关于通过 IPC 传递非 POD [普通旧数据类型]的主要内容,如果未能解决你的问题,请参考以下文章

按值、常量值、引用或常量引用传递非 POD 类型

const 正确清洗 pod(普通旧数据)

通过 IPC 跨进程传递对 COM 对象的引用?

Kubernetes之三 k8s中的pod

操作系统基础知识总结

IPC机制2