C++消息队列怎么创建
导读:本文共3267字符,通常情况下阅读需要11分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要:”,消息类型为TYPE。全部过程分为5步:第一步:定义消息结构structmsgbuf{longmtype;charctext[100];} 第二步:打开消息队列intmsgid;msgid=msgget(KEY,0666|IPC_CREAT);if(msgid<0) //打开或创建消息失败;第三步:组装消息,设置消息类型和拷贝消息数据structmsgbufbuf;buf... ...
目录
(为您整理了一些要点),点击可以直达。”,消息类型为TYPE。
全部过程分为5步:
第一步:定义消息结构
structmsgbuf{
longmtype;
charctext[100];
}
第二步:打开消息队列
intmsgid;
msgid=msgget(KEY,0666|IPC_CREAT);
if(msgid<0) //打开或创建消息失败;
第三步:组装消息,设置消息类型和拷贝消息数据
structmsgbufbuf;
buf.mtype=100;
strcpy(buf.ctext,“HELLOUNIX!”);
第四步:发送消息
intret;
ret=msgsnd(msgid,&buf,strlen(buf.ctext),0);
第五步:发送判断
if(ret==-1)
{
if(errno==EINTR) //信号中断,重新发送;
else//系统错误
}
进程在发送消息过程中如果接收到信号,将中止消息发送并返回EINTR错误,此时重新发送即可。
2、实例:循环读取键盘输入,并将输入的字符串写入到消息队列(关键字为0x1234)。
#include<sys/msg.h>include<sys/types.h>
include<sys/ipc.h>
include<stdio.h>
include<sys/errno.h>
include<string.h>
externinterrno;
structmymsgbuf{
longmtype;
charctext[100];
};
intmain(){
structmymsgbufbuf;
intmsgid;
if((msgid=msgget(0x1234,0666|IPC_CREAT))<0)
{
fprintf(stderr,"openmsg%xfailed.\n",0x1234);
return;
}
while(strncmp(buf.ctext,"exit",4))
{
memset(&buf,0,sizeof(buf));
fgets(buf.ctext,sizeof(buf.ctext),stdin);
buf.mtype=getpid();while((msgsnd(msgid,&buf,strlen(buf.ctext),0))<0) { if(errno==EINTR) continue; return; } } return0;
}
3、在UNIX中函数msgrcv从消息队列中接收消息,原型:
#include<sys/types>include<sys/ipc.h>
include<sys/msg.h>
intmsgrcv(intmsgid,void*msgp,intmsgsz,longmsgtyp,intmsgflg);
1)函数msgrcv从消息队列msgid中读取一条消息,参数含义:
msgid:消息队列标识号;
msgp:指向接收消息的内存缓冲区;
msgsz:指定该缓冲区的最大容量,不包括消息类型占用的部分;
msgtyp:指定读取消息的类型;
( 0:读取消息队列中第一个消息;
正整数:读取消息队列中第一个类型为msgtyp的消息;
负整数:读取消息队列中第一个类型小于或等于msgtyp的绝对值的消息。)
msgflg:指定了消息的接收方式
(IPC_NOWAIT:非阻塞方式读取信息;
MSG_NOERROR:截断读取消息。)
2)以阻塞方式从消息队列(关键字为KEY)接收消息,接收消息类型为TYPE。
第一步:定义消息结构
一般要求与发送消息程序中定义结构一致
第二步:打开(创建)消息队列
intmsgid;
msgid=msgget(KEY,0666|IPC_CREAT);
第三步:准备接收消息缓冲区
structmsgbufbuf;
memset(buf,0,sizeof(buf));
第四步:接收消息
intret;
ret=msgrcv(msgid,&buf,sizeof(buf.ctext),TYPE,0);
第五步:接收判断
if(ret==-1)
{
if(errno==EINTR) //信号中断,重新接收;
else//系统错误
}
4、实例:以阻塞方式不断从消息队列(关键字为0x1234)中读取消息,并打印接收到的消息类型、长度和数据等,当接收到内容为“exit”的消息时程序结束。
#include<sys/msg.h>include<sys/types.h>
include<sys/ipc.h>
include<stdio.h>
include<sys/errno.h>
externinterrno;
structmymsgbuf{
longmtype;
charctext[100];
};
intmain(){
structmymsgbufbuf;
intmsgid;
intret;
if((msgid=msgget(0x1234,0666|IPC_CREAT))<0) {
fprintf(stderr,"openmsg%Xfailed.\n",0x1234);
return;
}
while(strncmp(buf.ctext,"exit",4))
{
memset(&buf,0,sizeof(buf));
while((ret=msgrcv(msgid,&buf,sizeof(buf.ctext),buf.mtype,0))<0)
{
if(errno==EINTR)
continue;
return;
}
fprintf(stderr,"Msg:Type=%d,Len=%d,Text:%s",buf.mtype,ret,buf.ctext);
}
return0;
}
综合以上两个实例:
五、小结
1、采用消息队列通信比采用管道通信具有更多的灵活性,通信的进程不但没有血缘上的要求,也不需要进行同步处理。
2、消息队列是一种先进先出的队列型数据结构;
3、消息队列将输出的信息进行了打包处理,可以保证以消息为单位进行接收;
4、消息队列对信息进行分类服务,根据消息的类别进行分别处理。
5、提供消息数据自动拆分功能,同时不能接受两次发送的消息。
6、消息队列提供了不完全随机读取的服务。
7、消息队列提供了完全异步的读写服务。
C++消息队列怎么创建的详细内容,希望对您有所帮助,信息来源于网络。