2012年(8)
分类: LINUX
2012-07-13 15:36:42
Posix消息队列
消息队列可以认为是一个消息链表。有足够权限的线程可以往队列中放置消息,有足够读权限的线程可以从队列中取走消息。每个消息都是一个记录,它由发送者赋予一个优先级。在某个进程往消息队列中写入消息之前,不需要另外一个进程在该队列等待消息的到达。
对于Posix消息队列的读总是返回优先级最高的最早的消息
当往一个消息队列中写入消息的时候允许产生一个信号或者启动一个线程
消息队列中的消息的属性
一个无符号的整数优先级,
消息部分的长度
数据本身
消息队列的创建
#include
mqd_t mq_open(const char *name,int oflag, mode_t mode, struct mq_attr *attr);
oflag 参数是O_RDWR之类的,可以或O_CREAT或者是O_EXCL O_NONBLOCK
attr 参数用于新队列指定的某些属性 如果为空,使用默认属性
mq_open返回一个称为消息队列描述符的
#include
int mq_close(mqd_t mqds);
关闭消息队列,进程可以不用该描述符,但是消息队列并不从系统中删除,进程终止,所有的消息队列关闭。
#include
int mq_unlink(const char *name)
从系统中删除第一个参数的某个name, 由于消息队列具有随内核的持续性,所以就算没有进程打开某个消息队列,该队列及其设备上的各个消息也将一直存在。
#include
int mq_getattr(mqd_t mqdes,struct mq_attr,*attr);
int mq_setattr(mqd_t mqdes,const struct mq_attr attr, struct mq_attr* oattr);
struct mq_attr{
long mq_flags;
long mq_maxmsg;
long mq_msgsize;
long
mq_curmsgs;
}
消息队列有四个属性,用mqgetattr获得,用mqsetattr设置。
指向mq_attr,的结构体指针可以所谓mq_open的第四个参数,指定了maxmsg,和msgsize属性 open对另外两个结构体成员忽略。
setattr设置指定队列的消息,但是值使用mq_flag成员以设置或清楚非阻塞标志。其他三个成员被忽略。最大消息数和每个消息的最大字节数只能在创建的时候设置。
#include
int mq_send(mqd_t mqdes,const char *ptr,size_t len,unsigned int prio)
ssize_t mq_recive(mqd_t mqdes,char *ptr,size_t len,unsigned,int prio);
这两个函数分别往队列中放消息和从队列中取走消息。recive函数总是能够返回指定队列中优先级最高时间最早的消息,而且额该优先级能随消息内容长度一起返回
recive的len参数长度不能小于能加到该队列中的消息的最大大小。
消息队列的限制有
mqxmsg 队列中的最大消息数
msgsize 给定消息中的最大字节数
MQ_OPEN_MAX 一个进程能够打开的最大消息队列的数目
MQ_PRIO_MAX 任意消息的最大优先级值加1
其值往往定义在unistd.h中 可以运行syscnf函数获取。
System V 消息队列
system
V消息队列使用消息队列标识符表示,具有足够的特权的任何进程都可以往队列中放入消息,具有任何特权的进程都可一从一个给定的队列中读取消息。对于系统的中的每个消息队列,内核维护在
struct msqid_ds{
struct ipc_perm msg_prem;
struct msg *msg_first;
struct msg *msg_last;
msglen_t msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes
pid_t msg_lspid;
pid_t msg_lrpid;
time_t msg_stime;
time t msg_rtime;
time_t mst_ctime;
};
#include
int msgget(key_t key,int oflag)
msgget函数用于创建一个消息队列或者访问一个已经存在的消息队列
返回值是一个标识符,基于指向的key产生的。 Oflag是读写权限的组合 以IPC
#include
int msgsnd(int msqid,const void *ptr,size_t length,int flag)
使用msgget打开一个消息队列以后用snd往其队列中添加放置消息
ptr指向一个结构提指针
struct msgbuf{
long mbyte;
long mtext[1];
}
length 表示的是消息的长度,不带结构提中表示的long
flag可以是0也可以是IPC_NOWAIT 阻塞式的
#include
ssize_t msggrcv(int msqid,void *ptr,size_t length,long type,int flag)
函数用于从消息队列中获取消息
ptr指向消息要存放的位置
length制定了消息缓冲区的大小
type执行了希望从消息队列中去读什么样的数据 0表示第一个数据 大于0返回类型值位type的第一个消息 小于0返回类型值小于或者等于type参数绝对值消息中类型值最小的一个
flag设置阻塞式或者非阻塞式
#include
int msgctl(int msqid,int cmd,struct msqid_ds *buff)
函数提供了一个在消息队列上各种控制操作