进程通讯方式有很多种,OSX系统的进程通讯方式更是多种多样,笔者暂时只写过XPC和有名管道通讯的框架,特此记录一下自己的心得。
首先基于Pipe有名管道的进程通讯,我们将管道创建,打开,读取,写入等操作封装到CPipeWrapper的类中,方便对管道的一系列操作。
class CPipeWrapper
{
public:
CPipeWrapper();
~CPipeWrapper();
int CreatePipe(const char *szPipeName,int mode = 0777);
int OpenPipe(const char *szPipeName,int mode);
ssize_t ReadFromPipe(void *pBuffer, size_t nLen);
ssize_t WriteToPipe(void *pBuffer,size_t nLen);
int GetPipeDescr() const;
private:
int m_pipe;
};
在进程通讯过程中,我们需要处理各种定义的指令和包,在此我们需要对指令包进行简单地封装操作。定义CCommandDataWrapper方便我们对指令的传输和处理操作。
#pragma pack(1)
template <class PARAM_DATA_TYPE>
struct CommandData
{
COMMAND_TYPE type;
uint32_t CRC;
uint32_t bufferLen;
PARAM_DATA_TYPE paramDataStruct;
};
template <class PARAM_DATA_TYPE>
class CCommandDataWrapper
{
public:
bool initializeWithCommandData(const void *pCommandData ,size_t nDataLen);
bool initializeWithCommandStruct(PARAM_DATA_TYPE paramData ,COMMAND_TYPE type);
const void* getData() const;
uint32_t getDataLen()