linux 消息队列的应用实例(代码)

27 篇文章 0 订阅
3 篇文章 0 订阅
该博客详细介绍了消息队列的创建、删除以及使用,包括msgIdCreate函数用于清空消息队列并重新创建,msgrecv和msgsend函数实现消息的接收与发送。在main函数中,通过msgIdCreate初始化消息队列,并根据接收到的消息类型执行相应操作。sendMsgToQueue函数负责将数据发送到消息队列,特别注意了内存的动态分配与释放。
摘要由CSDN通过智能技术生成

 msgid create

/***********************************************************************
* 函数名   : msgIdCreate
* 功能描述 : 此处执行两次是为了清空消息队列中的内容,
            因为进程即使结束,消息队列中的数据仍然存在;
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
#define SEND_MSG_KEY   1024
int msgIdCreate(void )
{
	int sendMsgid = 0;
	
	sendMsgid = msgget(SEND_MSG_KEY,IPC_CREAT | 0777);	
	if(sendMsgid == ERROR)
	{
		printf("[%s][%d] create msg failed\r\n",__func__,__LINE__);
		return ERROR;
	}	
	//删除消息队列,这里把之前的数据相当于删除;
	msgctl(sendMsgid ,IPC_RMID,NULL);
	
	sendMsgid = msgget(SEND_MSG_KEY,IPC_CREAT | 0777);
	if(sendMsgid == ERROR)
	{
		printf("[%s][%d] create msg failed\r\n",__func__,__LINE__);
		return ERROR;
	}
	return sendMsgid ;
}

msg recv

/***********************************************************************
* 函数名   : main
* 功能描述 : 
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
enum{
    XXX = 1,
    YYY,
};

struct dataMsg {
	long type;
	unsigned int cmd;
	unsigned int code;
	char *data;
};

int main(void )
{
	struct dataMsg sendMsg;
	int ret = OK;
	
	msgIdCreate();
	while(1)
	{
		memset(&sendMsg,0,sizeof(struct dataMsg));
		ret = msgrcv(sendMsgId,&sendMsg,sizeof(struct dataMsg) - sizeof(long),0,0);
		if(ret < 0)
		{
			printf("[%s][%d] errno:%d\r\n",__func__,__LINE__\r\n,errno);			
			continue;
		}
		
		switch(sendMsg.cmd)
		{
			case XXX:
				printf("print XXX\r\n");
				break;
			case YYY:
				printf("print YYY\r\n");
				break;				
			default :
				printf("[%s][%d] recv msg default\r\n",__func__,__LINE__);				
				break;
		}
	}
}

msg send

/***********************************************************************
* 函数名   : sendMsgToQueue
* 功能描述 : 注意发送的malloc的内容在接收端要释放
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
int sendMsgToQueue(unsigned int cmd,unsigned int code,char *buf)
{
	struct dataMsg sendMsg;
	int malloclen = 0;
	char *mallocbuf;
	int ret = OK;
	
	memset(&sendMsg,0,sizeof(struct dataMsg));
	sendMsg.type = 1;
	sendMsg.cmd = cmd;
	sendMsg.code = code;
	if(buf != NULL)
	{
		malloclen = strlen(buf) + 1;
		mallocbuf = (char *)malloc(malloclen);
		if(mallocbuf == NULL)
		{
			printf("[%s][%d] malloc data buf failed\r\n",__func__,__LINE__);	
			return ERROR;
		}
		memset(mallocbuf,0,malloclen);
		strcpy(mallocbuf,buf);	
		sendMsg.data = mallocbuf;
		printf("[%s][%d] malloc data buf = %p,buf = %s\r\n",__func__,__LINE__,mallocbuf,buf);		
	}
	
	ret = msgsnd(sendMsgId,&sendMsg,sizeof(struct dataMsg) - sizeof(long),IPC_NOWAIT);
	if(ret == ERROR)
	{
		printf("[%s][%d] send msg failed errno:%d\r\n",__func__,__LINE__,errno);
		return ERROR;		
	}
	return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值