概述
- 消息队列可认为是一个消息链表
进程从其中读出消息,放入消息.
每个消息是一个记录[边界消息]
消息队列有随内核持续性
对比FIFO
FIFO必须同时有进程发出对其读打开,写打开请求时,才能打开.而消息队列不必.
FIFO最后一次关闭时,其上数据丢弃.消息队列即使关闭的.内核仍然维护消息队列对象及其数据.
FIFO是字节流消息[无边界]
每个消息:
1.有一个整数表示的优先级
2.消息数据部分长度,可为0
3.数据部分
mq_open,mq_close,mq_unlink
mqd_t mq_open(
const char *name,
int oflag,
...);
int mq_close(mqd_t mqdes);
int mq_unlink(const char* name);
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 mg_msgsize;
long mq_curmsgs;
};
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);
mq_notify
Posix消息队列允许异步事件通知,以告知何时有一个消息放置到了某个空消息队列中。
- 产生一个信号
- 创建一个线程来执行一个指定的函数
int mq_notify(mqd_t mqdes, const struct sigevent *notification);
union sigval
{
int sival_int;
void *sival_ptr;
};
struct sigevent
{
int sigev_notify;
int sigev_signo;
union sigval sigev_value;
void (*sigev_notify_function)(union sigval);
pthread_attr_t *sigev_notify_attributes;
};