消息队列概述
顾名思义,消息队列就是一个消息的列表。用户可以从消息队列种添加消息、读取消息
等。从这点上看,消息队列具有一定的FIFO 的特性,但是它可以实现消息的随机查询,比
FIFO 具有更大的优势。同时,这些消息又是存在于内核中的,由“队列ID”来标识。
消息队列实现
1.函数说明
消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这四种操
作。其中创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统消
息队列数量的限制;添加消息使用的函数是msgsnd 函数,它把消息添加到已打开的消息队列
末尾;读取消息使用的函数是msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里
可以指定取走某一条消息;最后控制消息队列使用的函数是msgctl,它可以完成多项功能。
了msgget函数的语法要点
所需头文件
#include
#include
#include
函数原型 int msgget(key_t key,int flag)
函数传入值
Key:返回新的或已有队列的队列ID,IPC_PRIVATE
Flag:
函数返回值
成功:消息队列ID
出错:-1
了msgsnd函数的语法要点
所需头文件
#include
#include
#include
函数原型int msgsnd(int msqid,const void *prt,size_t size,int flag)
函数传入值
msqid:消息队列的队列ID
prt:指向消息结构的指针。该消息结构msgbuf为:
struct msgbuf{
long mtype;//消息类型
char mtext[1];//消息正文
}
size:消息的字节数,不要以null结尾
IPC_NOWAIT若消息并没有立即发送而调用进程会立即返回
flag:
0:msgsnd调用阻塞直到条件满足为止
函数返回值
成功:0
出错:-1
使用实例
#include
#include
#include
struct msg_buf
{
int mtype;
char data[255];
};
int main()
{
key_t key;
int msgid;
int ret;
struct msg_buf msgbuf;
key=ftok("/tmp/2",'a');
printf("key =[%x]\n",key);
msgid=msgget(key,IPC_CREAT|0666); /*通过文件对应*/
if(msgid==-1)
{
printf("create error\n");
return -1;
}
msgbuf.mtype = getpid();
strcpy(msgbuf.data,"test haha");
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
if(ret==-1)
{
printf("send message err\n");
return -1;
}
memset(&msgbuf,0,sizeof(msgbuf));
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);
if(ret==-1)
{
printf("recv message err\n");
return -1;
}
printf("recv msg =[%s]\n",msgbuf.data);
}
阅读(2089) | 评论(0) | 转发(1) |