您的位置:首页 > 其它

消息队列通讯

2016-04-10 15:46 357 查看
一、消息队列概念:

消息队列就是一个消息的链表。而一条消息可以看做一个记录,具有特定的格式,进程可以按照一定的规则添加新消息,另一个进程可以从消息队列中独自消息。



二、消息队列函数

1.创建/打开消息队列

manmsgget(key_tkey,intmsgflg)

返回值:

成功:返回消息队列的ID“

失败:失败返回-1

参数:

key:键值

msgflg:打开标志,IPC_CREAT表明创建一个消息

2.发送数据

msgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg)

structmsgbuf{

longmtype;/*messagetype,mustbe>0*///表明消息的类型,可以根据消息类型的不同从消息队列中取出消息

charmtext[1];/*messagedata*///消息中数据

};

功能:发送消息到消息队列

返回值:

失败:-1

成功:0

参数:

msqid:消息队列的id

msgq:指向要发送的消息,

msgsz:消息的长度,不包含类型

msgfg:标志位

3.从消息队列中接收消息

sszie_tmsgrcv(intmsqid,void*msgp,size_tmsgsz,longmsgtyp,intmsgflg)

返回值:

失败:-1

成功:返回实际接收消息的长度

参数:

msqid:消息队列的id

msgp:存放取出的消息

msgsz:取出消息的最大长度

msgtyp:

=0直接忽略类型,只取消息队列中的第一个消息

>0取消息队列中类型等于msgtyp的第一条消息

<0取消息队列中类型比msgtyp要小或者等于的消息,如果小多条消息满足条件,则取类型最小的类型

msgflg:标志

4.从消息队列中删除消息

intmsgct(intmsqid,intcmd,structmsqid_ds*buf)

返回值:

成功返回0

失败-1

参数:

msqid:消息队列的ID

cmd:对消息队列要执行的命令,IPC_RMID用来删除消息队列

buf:获取内核中的msqid_ds结构,通常不用

三、消息队列综合实例:



A进程:

1.创建消息队列

2.

while循环

2.1从键盘中获取输入,包括消息的类型以及消息的数据

2.2.发送到消息队列

3.删除消息队列

send.c

#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>
/*定义消息的结构*/
structmsgbuf
{
longmsgtype;//消息的类型
charmsgtext[1024];//消息数据
};
intmain()
{
intmsgid;
intmsg_type;
charstr[256];
structmsgbufmsgs;
//1.创建消息队列
msgid=msgget(1024,IPC_CREAT);
//2.
while(1)
{
printf("pleaseinputmessagetype,0forquit!\n");
//2.1获取消息类型
scanf("%d",&msg_type);
//2.2如果用户输入的消息为0,退出该循环
if(msg_type==0)
{
break;
}
//2.3获取消息数据
printf("pleaseinputmessagecontent\n");
scanf("%s",str);
msgs.msgtype=msg_type;
strcpy(msgs.msgtext,str);
//2.4发送消息
msgsnd(msgid,&msgs,sizeof(structmsgbuf),0);
}
//3删除消息队列
msgctl(msgid,IPC_RMID,0);
return0;
}


receicve.c

#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>
/*定义消息的结构*/
structmsgbuf
{
longmsgtype;//消息的类型
charmsgtext[1024];//消息数据
};
intmain()
{
intmsgid;
intmsg_type;
charstr[256];
structmsgbufmsgs;
//1.创建消息队列
msgid=msgget(1024,IPC_CREAT);
//2.
while(1)
{
printf("pleaseinputmessagetype,0forquit!\n");
//2.1获取消息类型
scanf("%d",&msg_type);
//2.2如果用户输入的消息为0,退出该循环
if(msg_type==0)
{
break;
}
//2.3获取消息数据
printf("pleaseinputmessagecontent\n");
scanf("%s",str);
msgs.msgtype=msg_type;
strcpy(msgs.msgtext,str);
//2.4发送消息
msgsnd(msgid,&msgs,sizeof(structmsgbuf),0);
}
//3删除消息队列
msgctl(msgid,IPC_RMID,0);
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: