消息队列,是消息的链接表,存放在内核中。一个消息队列有一个人标识符(及队列ID)来标识。
1、特点:
①、消息队列是面向记录的,其中的消息具有特定的格式以及待定的优先级。
②、消息队列独立与发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
③、消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
2、原型:
#include
//创建或打开消息队列:成功返回队列ID,失败返回-1
int msgget(key_t key,int flag);
//key索引值,flag打开队列的方式
//添加消息:成功返回0,失败返回-1
int msgsnd(int msqid,const void *ptr,size_t size,int flag);
//队列ID,消息,消息大小,标志位。
//读取消息:成功返回消息数据的长度,失败返回-1
int msgrcv(int msqid, void *ptr,size_t size,long type,int flag);
//队列ID,消息,消息大小,类型,标志位。
//控制消息队列:成功返回0,失败返回-1
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
//队列ID,
//消息队列的移除
以下两种情况下:msgget将创建一个新的消息队列:
①、如果没有与键值key相对应的消息队列,并且flag中包含了IPC_CREAT标志位
②、key参数为IPC_PRIVATE。
函数msgrcv在读取消息队列时,type参数有以下几种情况:
①、type == 0,返回队列中的第一个消息
②、type > 0,返回队列中消息类型为type的第一个消息。
③、type < 0,返回队列中消息类型值小于或等于type绝对值的消息,如果有多个则取类型的最小值。
例:
获取,读
#include
#include
#include
#include
struct msgbuf{
long mtype;
char mtext[128];
};
int main()
{
struct msgbuf readBuf;
int msgID = msgget(0x1234,IPC_CREAT|0777);
//有队列就获取,没有就创建,| 权限可读可写可执行
if(msgID == -1){
printf("get que failure\n");
}
msgrcv(msgID,&readBuf,sizeof(readBuf.mtext),888,0);
//接收
printf("read from que :%s\n",readBuf.mtext);
return 0;
}
发送
#include
#include
#include
#include
#include
struct msgbuf{
long mtype;
char mtext[128];
};
int main()
{
struct msgbuf sendBuf = {888,"this is message from quen"};
int msgID = msgget(0x1234,IPC_CREAT|0777);
//有队列就获取,没有就创建,| 权限可读可写可执行
if(msgID == -1){
printf("get que failure\n");
}
msgsnd(msgID,&sendBuf,strlen(sendBuf.mtext),0);
//发送数据
return 0;
}
单运行获取get时会发生阻塞,需要运行发送send才可以继续运行
两个互相通信:
#include
#include
#include
#include
#include
struct msgbuf{
long mtype;
char mtext[128];
};
int main()
{
struct msgbuf sendBuf = {888,"this is message from quen"};
struct msgbuf readBuf;
int msgID = msgget(0x1234,IPC_CREAT|0777);
//有队列就获取,没有就创建,| 权限可读可写可执行
if(msgID == -1){
printf("get que failure\n");
}
msgsnd(msgID,&sendBuf,strlen(sendBuf.mtext),0);
//发送数据
msgrcv(msgID,&readBuf,sizeof(readBuf.mtext),988,0);
//接收
printf("reaturn from get :%s\n",readBuf.mtext);
return 0;
}
#include
#include
#include
#include
#include
struct msgbuf{
long mtype;
char mtext[128];
};
int main()
{
struct msgbuf readBuf;
int msgID = msgget(0x1234,IPC_CREAT|0777);
//有队列就获取,没有就创建,| 权限可读可写可执行
if(msgID == -1){
printf("get que failure\n");
}
msgrcv(msgID,&readBuf,sizeof(readBuf.mtext),888,0);
//接收
printf("read from que :%s\n",readBuf.mtext);
struct msgbuf sendBuf = {988,"thank you for reach !"};
msgsnd(msgID,&sendBuf,strlen(sendBuf.mtext),0);
return 0;
}