一、消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
1.特点:
1.消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
2.消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
3.消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
2.原型:
#include <sys/msg.h>
2 // 创建或打开消息队列:成功返回队列ID ,失败返回-1
3 int msgget(key_t key, int flag);
4 // 添加消息:成功返回0,失败返回-1
5 int msgsnd(int msqid, const void *ptr, size_t size, int flag);
6 // 读取消息:成功返回消息数据的长度,失败返回-1
7 int msgrcv(int msqid, void *ptr, size_t size, long type,int flag);
8 // 控制消息队列:成功返回0,失败返回-1
9 int msgctl(int msqid, int cmd, struct msqid_ds *buf);
在以下两种情况下,msgget将创建一个新的消息队列:
如果没有与键值key相对应的消息队列,并且flag中包含了IPC_CREAT标志位。(通过key值找到相应队列)
3.例子:
通过key值获得对应队列
#include<string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<stdio.h>
#include <stdlib.h>
struct msgform{
long type;
char mtext[256];
};
int main()
{
long msgid;
struct msgform msg;
key_t key = ftok(".",'z');
if(key == -1){
perror("why");
exit(-1);
}
msgid = msgget(key,IPC_CREAT|0777);
if(msgid == -1){
printf("msgget error\n");
exit(-1);
}
msgrcv(msgid,&msg,sizeof(msg.mtext),888,0);
printf("get msg :%s\n",msg.mtext);
struct msgform sendbuf = {777,"qwerdf"};
msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);
return 0;
}
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
struct msgform{
long type;
char mtext[256];
};
int main()
{
int msgid;
struct msgform msg = {888,"haohaoxuexi"};
struct msgform readbuf;
//key_t key = ftok(".",1);
key_t key = ftok(".",'z');
if(key == -1){
perror("why");
exit(-1);
}
msgid = msgget(key,IPC_CREAT|0777);
if(msgid == -1){
printf("msgget error\n");
exit(-1);
}
msgsnd(msgid,&msg,strlen(msg.mtext),0);
msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),777,0);
printf("%s\n",readbuf.mtext);
return 0;
}