Linux下编程消息队列怎么封装较好,怎么保证2个进程能用同一个消息队列?

 我来答
都市子规
2013-05-09
知道答主
回答量:19
采纳率:0%
帮助的人:14.6万
展开全部
消息队列就是用来进程间通信的, 每个进程只要知道消息队列的queueID即可

#ifndef CMSGOP_H
#define CMSGOP_H
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
class CMsgOp
{
public:
CMsgOp();
virtual ~CMsgOp();
typedef struct _customMessageFormat{
int processID;
int cmd;
int commandArg;
}CCustomMessageFormat;

int init();
int send(const CCustomMessageFormat &message);
int receive(CCustomMessageFormat &message);
private:
int msgQueueID;
struct msgbuf sendBuf;
struct msgbuf recvBuf;

};

#endif // CMSGOP_H

#include "cmsgop.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
CMsgOp::CMsgOp()
{
}

CMsgOp::~CMsgOp()
{
msgctl(msgQueueID, IPC_RMID, NULL);
}

int CMsgOp::init()
{
key_t key = ftok("/home/maemo/tmp2", 1);
if(-1 == key)
{
perror("ftok failed!");
return -1;
}

int ret = msgget(key, IPC_CREAT);
if(-1 == ret)
{
perror("create message queue failed!");
return -1;
}

msgQueueID = ret;
return 0;
}

int CMsgOp::send(const CCustomMessageFormat &message)
{
memcpy(sendBuf.mtext, &message, sizeof(CCustomMessageFormat));
sendBuf.mtype = 1;
int ret = msgsnd(msgQueueID, &sendBuf, sizeof(CCustomMessageFormat), 0);
if(-1 == ret)
{
perror("message send failed!");
return ret;
}
}

int CMsgOp::receive(CCustomMessageFormat &message)
{
int ret = msgrcv(msgQueueID, &recvBuf, sizeof(CCustomMessageFormat), 0, IPC_NOWAIT);
if(-1 == ret)
{
perror("receive message failed!");
return -1;
}

memcpy(&message, recvBuf.mtext, sizeof(CCustomMessageFormat));
return ret;
}
道祖一鸿钧
2013-05-09 · 超过21用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:21.1万
展开全部
msgget函数里面那个key值,在写程序时两边一样的就可以打开同一个消息队列了!
key值就是函数的第一个参数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bj...4@163.com
2013-05-09
知道答主
回答量:35
采纳率:0%
帮助的人:7.4万
展开全部
天就在信息板上写一条与奶粉有关的营养信息(要和自己经营的奶粉品牌
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fangj1n
2013-05-09 · TA获得超过105个赞
知道答主
回答量:642
采纳率:0%
帮助的人:188万
展开全部
你说什么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式