消息队列的原理
消息队列示例代码:
# include <sys/mag.h> /* msgget()创建或者获取一个消息队列 msgget()成功返回消息队列ID,失败返回-1 msqflg:IPC_CREAT */ int misqid=msgget(ket_t key,int msqflg); /* msgsnd()发生一条信息,信息结构为: struct msgbuf { long mtype;//消息类型,必须时长整型 char mtext[1];//消息数据 }; msgsnd()成功返回0,失败返回-1 第一个参数msqid是由msgget函数返回的消息队列标识符。 第二个参数msqp是一个指向准备发送消息的指针,消息必须像刚才说的那样以一个长整型成员变量开始。 第三个参数msqz时msqp指向的消息的长度,这个长度只是消息数据的长度。 第四个参数msgflg控制在当前消息队列满或队列消息到达系统范围的限制时将要发生的事情。如果msgflg中设置了IPC_NOWAIT标志,函数将立刻返回,不发送消息并且返回值为-1.如果msgflg中的IPC_NOWAIT标志被清除,则发送进程将挂起以等待队列中腾出可用空间。 msqsz:指定mtext中有效数据的长度 msqflg:一般设置为0可以设置为IPC_NOWAIT */ int msgsnd(int msqid,const void *msqp,size_t msqsz,int msqflg); /* msgrcv()接收一条消息 msgrcv()成功返回mtext中接收到的数据长度,失败返回-1 msqtyp:指定接收消息的类型,类型可以为0表示接收消息队列中所有类型的消息 第一个参数msqid是由msgget函数返回的消息队列标识符。 msqflg:一般设置为0,可以设置IPC_NOWAIT */ size_t msgrcv(int msqid,void *msgp,size_tmsqsz,long msqtyp,int msqflg); /* msgctl()控制消息队列 msgctl()成功返回0,失败返回-1 cmd:IPC_RMID */ int msgctl(int msqid,int cmd,struct msqid_ds*buf);
示例代码:进程a发送一条消息,进程b读取消息
a.c代码
# include <stdio.h> # include <stdlib.h> # include <unistd.h> # include <assert.h> # include <string.h> # include <sys/msg.h> typedef struct msgdata { long mtype; char mtext[128]; }MSgData; int main () { intmsgid=msgget((key_t) 1234,0664|IPC_CREAT); assert(msgid!=-1); MsgData data; memset(&data,0,sizeof (data)); data.mtype=1; strcpy(data.mtext,"hello"); msgnd(msgid,&data,128,0); exit(0); }
b.c代码
# include <stdio.h> # include <stdlib.h> # include <unistd.h> # include <assert.h> # include <string.h> # include <sys/msg.h> typedef struct msgdata { long mtyoe; char mtext[128]; }MsgData; int main () { int msgid=msgget((key_t)1234,IPC_CREAT|0664); assert(msgid!=-1); MsgData data; memset(&data,0,sizeof (data)); msgrv(msgid,&data,128,1,0); printf ("data.type:%d\n",data.mtype); printf ("data.text:%s\n",data.mtext); msgctl(msgid,IPC_RMID,NULL); exit(0); }
10-20