1、简介
消息队列是消息的链接表 ,存放在内核中并由消息队列标识符标识。我们将称消息队列为 “队列”,其标识符为“队列 I D”。 m s g g e t用于创建一个新队列或打开一个现存的队列。 m s g s n d用于将新消息添加到队列尾端。每个消息包含一个正长整型类型字段,一个非负长度以及实际数据字节(对应于长度),所有这些都在将消息添加到队列时,传送给 m s g s n d。 m s g r c v用于从队列中取消息。我们并不一定要以先进先出次序取消息,也可以按消息的类型字段取消息。
2、函数介绍
ftok函数
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);//“/home/linux” , ‘a’
功能:生成一个key(键值)
msgget函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
功能:创建或取得一个消息队列对象
返回:消息队列对象的id 同一个key得到同一个对象
格式:msgget(key,flag|mode);
flag:可以是0或者IPC_CREAT(不存在就创建)
mode:同文件权限一样
msgsnd函数
int msgsnd(int msqid, const void msgp, size_t msgsz, int msgflg);
功能:将msgp消息写入标识为msgid的消息队列
msgp:
struct msgbuf {
long mtype; / message type, must be > 0 /消息的类型必须>0
char mtext[1]; / message data */长度随意
};
msgsz:要发送的消息的大小 不包括消息的类型占用的4个字节
msgflg: 如果是0 当消息队列为满 msgsnd会阻塞
如果是IPC_NOWAIT 当消息队列为满时 不阻塞 立即返回
返回值:成功返回id 失败返回-1
msgrcv函数
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
功能:从标识符为msgid的消息队列里接收一个指定类型的消息 并 存储于msgp中 读取后 把消息从消息队列中删除
msgtyp:为 0 表示无论什么类型 都可以接收
msgp:存放消息的结构体
msgsz:要接收的消息的大小 不包含消息类型占用的4字节
msgflg:如果是0 标识如果没有指定类型的消息 就一直等待
如果是IPC_NOWAIT 则表示不等待
msgctl函数
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
msgctl(msgid,IPC_RMID,NULL);//删除消息队列对象
代码实现
消息队列写入端
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include<string.h>
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[128]; /* message data */
};
void main() {
key_t key;
int i;
key = ftok(".", 1);
int msgid;
struct msgbuf writebuf;
writebuf.mtype=888;
strcpy(writebuf.mtext,"heallo");
i = msgget(key, IPC_CREAT | 0777);
if (i == -1) {
perror("msgget");
}
msgsnd(i, &writebuf, sizeof(writebuf.mtext), 0);
}
消息队列读端
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <stdio.h>
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[128]; /* message data */
};
void main() {
key_t key;
int i;
key = ftok(".", 1);
int msgid;
struct msgbuf readbuf;
i = msgget(key, IPC_CREAT | 0777);
if (i == -1) {
perror("msgget");
}
msgrcv(i, &readbuf, sizeof(readbuf.mtext), 888,0);
printf("read=%s\n",readbuf.mtext);
}