命名管道策略与动态内存?

时间:2009-09-08 02:28:25

标签: c++ windows linux memory-management named-pipes

Hokay所以我有一个应用程序,我需要一些IPC ...我认为命名管道是要走的路,因为它们很容易使用。

无论如何,我有一个关于如何使用命名管道处理动态内存的问题。

说我有一个这样的课程:

class MyTestClass {
public:
    MyTestClass() { _data = new int(4); }

    int GetData() { return *_data; }
    int GetData2() { return _data2; }

private:
    int* _data;
    int _data2;
};

现在,当我创建一个充满MyTestClass个对象的缓冲区然后通过管道发送它们时,我显然在目标进程中丢失了_data并且变得垃圾。我应该使用一些策略吗?我可以为简单的情况使用值类型,但对于许多复杂的类,我需要使用某种动态内存,我喜欢指针。

或者,我应该只看一下使用共享内存吗?感谢

2 个答案:

答案 0 :(得分:3)

命名管道和共享内存都有类似的问题:您需要将结构的内容序列化到发送端,并从接收端反序列化结构。

无论是使用命名管道还是共享内存,序列化过程基本相同。对于嵌入式指针(如_data和_data2),您需要以一致的方式序列化指针的内容。

您可以使用许多序列化策略,具体取决于您的结构在内存中的布局以及IPC的效率。或者您可以使用DCE RPC并让RPC编组代码为您处理复杂性。

答案 1 :(得分:1)

要通过命名管道发送数据,您必须序列化(或编组)发送端的数据,并在接收端反序列化(或解组)它。

听起来很可疑,好像你只是在数据结构中写一个字节的副本。这不是什么好事。您没有复制分配的数据(它不是存储在数据结构的第一个和最后一个字节之间,而是存储在其他地方之间)并且您正在从一台机器(或进程)复制指针(_data)到另一个,并且本地进程中的内存地址在另一个中没有保证意义。

定义自己的线路协议(如果绝望,请查看ASN.1 - 不,再想一想,不要那么绝望),它定义了通过线路传输的数据布局。然后实现发送器和接收器(或seralizer和解串器)功能。或者找到其他人已经执行此操作的代码。

还记得要处理字节序 - 你必须定义通过命名管道发送字节的顺序。

例如,您可以定义发送的消息由网络字节顺序中的4字节无符号整数组成,定义后面有多少结构,每个结构可以是数组的4个带符号4字节整数的序列,后跟_data2的单个带符号4字节整数(也以网络字节顺序发送)。

请注意,命名管道作为IPC机制的选择在很大程度上是无关紧要的;除非你使用共享内存(固有地在同一台机器上),否则必须处理字节序,即使使用共享内存,也需要处理序列化。