对消息队列的操作无非有下面三种类型:
1、打开或创建消息队列
消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,只需提供该消息队列的键值即可;
注:消息队列描述字是由在系统范围内唯一的键值生成的,而键值可以看作对应系统内的一条路经。
2、读写操作
消息读写操作非常简单,对开发人员来说,每个消息都类似如下的数据结构:
C代码
struct msgbuf
{
long mtype;
char mtext[1];
};
struct msgbuf
{
long mtype;
char mtext[1];
};
mtype成员代表消息类型,从消息队列中读取消息的一个重要依据就是消息的类型;mtext是消息内容,当然长度不一定为1。因此,对于发送消息来说,首先预置一个msgbuf缓冲区并写入消息类型和内容,调用相应的发送函数即可;对读取消息来说,首先分配这样一个msgbuf缓冲区,然后把消息读入该缓冲区即可。
3、获得或设置消息队列属性:
消息队列的信息基本上都保存在消息队列头中,因此,可以分配一个类似于消息队列头的结构(struct msqid_ds,见附录 2),来返回消息队列的属性;同样可以设置该数据结构。
消息队列API
1、文件名到键值
C代码
#include <sys/>
#include <sys/>
key_t ftok (char*pathname, char proj);
#include <sys/>
#include <sys/>
key_t ftok (char*pathname, char proj);
它返回与路径pathname相对应的一个键值。该函数不直接对消息队列操作,但在调用ipc(MSGGET,…)或msgget()来获得消息队列描述字前,往往要调用该函数。典型的调用代码是:
C代码
key=ftok(path_ptr, 'a');
ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0);
…
key=ftok(path_ptr, 'a');
ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0);
…
系统V消息队列API共有四个,使用时需要包括几个头文件:
C代码
#include <sys/>
#include <sys/>
#include <sys/>
#include <sys/>
#include <sys/>
#include <sys/>
1)int msgget(key_t key, int msgflg)
参数key是一个键值,由ftok获得;msgflg参数是一些标志位。该调用返回与健值key相对应的消息队列描述字。
在以下两种情况下,该调用将创建一个新的消息队列:
如果没有消息队列与健值
消息队列操作和实例 来自淘豆网m.daumloan.com转载请标明出处.