POSIX message queue

来源:互联网 发布:lol海兽祭司技能数据 编辑:程序博客网 时间:2024/05/16 17:10

http://hi.baidu.com/gaomanyi/blog/item/5a0be53620ef46380b55a955.html

 

POSIX消息队列可以认为是一个链表。有足够写权限的线程都可以往队列中放置消息, 有足够读权限的线程都可以从队列中取走消息, 每个消息是一个记录, 它由发送者赋予一个优先级。在某个进程往一个队列写入消息之前, 并不需要另外某个进程在该队列上等待消息的到达。

一个进程可以往某个 队列写入一些消息后终止, 让另外一个进程在某个时刻读出这些消息。我们说消息队列具有随内核的持续性。

列举函数和接口如下:

#include<mqueue.h>
mqd_t mq_open(const char *name,int oflag,.../*mode_t mode,struct mq_attr *attr*/);
int mq_close(mqd_t mqdes);
int mq_unlink(const char *name);
int mq_getattr(mqd_t mqdes,struvt mq_attr *attr);
int mq_setattr(mqd_t mqdes,const struct mq_attr *attr,struct mq_attr *attr);
int mq_send(mqd_t mqdes,const char *ptr,size_t len,unsigned int prio);
ssize_t mq_receive(mqd_t mqdes,char *ptr,size_t len,unsigned int *priop);
int mq_notify(mqd_t mqdes,const struct sigevent *notification);//异步通知消息到达:产生一个信号,或创建一个线程执行一个指定的函数

struct mq_attr{
long mq_flags; /*message queue flag*/
long mq_maxmsg;/*max number of messages allowed on queue*/
long mq_msgsize;/*max size of a message in bytes*/
long mq_curmsgs;/*number of messages currently on queue*/
};

union sigval {
int sival_int;/*integer value*/
void *sival_ptr;/*pointer value*/
};

struct sigevent{
int sigev_notify;/*SIGEV_{NONE,SIGNAL,THREAD}*/
int sigev_sigev_signo;/*signal number if SIGEV_SIGNAL*/
union sigval sigev_value;/*passed to signal handler or thread*/
                         /*following two if SIGEV_THREAD*/
void (*sigev_notify_function)(union sigval);
pthread_attr_t *sigev_notify_attributes;
};