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

时间:2013-03-08 13:06:01

标签: c++ c ipc message-queue dbus

我正在编写一个执行IPC的实现。用户进行呼叫,我将所有这些参数传递给其他进程。

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

  1. 获取所有参数并将它们放入结构中。
  2. 添加IPC所需的其他信息。将此结构的大小和指针传递给POSIX消息队列。 读取此地址的数据,直到指定的大小,并将其发送到其他进程。
  3. 解构构造以获取参数。
  4. 使用这些参数调用实际函数。
  5. 当我只有普通的旧数据类型时,这完全正常。但是当函数参数是非POD时,我的逻辑失败是因为:

    1. 在非POD类型的情况下,我无法确定总数据的大小[消息队列需要]
    2. 某些类可能包含动态增加的实体,如矢量。
    3. 有人可以说明我如何处理这种情况吗?

1 个答案:

答案 0 :(得分:1)

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

E.g。您可以定义一个表示在各方之间交换的消息的类型,然后实现将对象序列化为消息的通用函数。如果您有自定义逻辑,则需要专门化序列化功能。

这里有一些伪代码:

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 >>执行类似操作。然后你做:

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

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

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