通过IPC传递非PODs [Plain old DataTypes]

Passing non PODs [ Plain old DataTypes ] over IPC

本文关键字:Plain old DataTypes PODs IPC 通过      更新时间:2023-10-16

我正在写一个实现做IPC。用户做一个调用,我把所有这些参数传递给其他进程。

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

  1. 获取所有参数并将它们放入一个结构中。
  2. 添加IPC所需的其他信息。将该结构体的大小和指针传递给POSIX消息队列。从该地址读取数据,直到指定的大小,并发送给其他进程。
  3. 反构造结构来获取参数。
  4. 使用这些参数调用实际函数

当我只有普通的旧数据类型时,这工作得很好。但是当函数参数是非pod时,我的逻辑失败了,因为:

  1. 我真的不能告诉总数据的大小,在非pod类型的情况下[消息队列所需]
  2. 一些类可能包含动态增加的实体,如向量。

谁能给我一个主意,我该如何处理这种情况?

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

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

下面是一些伪代码:

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方法对可序列化类型进行抽象)