C++消息队列怎么创建(C++,开发技术)

时间:2024-04-28 01:15:18 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

”,消息类型为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,&amp;buf,strlen(buf.ctext),0))&lt;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;
}

综合以上两个实例:

C++消息队列怎么创建

五、小结

  • 1、采用消息队列通信比采用管道通信具有更多的灵活性,通信的进程不但没有血缘上的要求,也不需要进行同步处理。

  • 2、消息队列是一种先进先出的队列型数据结构;

  • 3、消息队列将输出的信息进行了打包处理,可以保证以消息为单位进行接收;

  • 4、消息队列对信息进行分类服务,根据消息的类别进行分别处理。

  • 5、提供消息数据自动拆分功能,同时不能接受两次发送的消息。

  • 6、消息队列提供了不完全随机读取的服务。

  • 7、消息队列提供了完全异步的读写服务。

相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

本文:C++消息队列怎么创建的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:java高并发InterruptedException异常问题怎么解决下一篇:

33 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18