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;
}