第2章 Posix消息队列
2.1 概述
每个消息都是一个有优先级的记录,进程写入消息前,不需要有其它进程在等待消息。消息队列具有随内核的持续性。
Posix消息队列与System V消息队列的两个主要区别:
1. Posix读返回最高优先级的最早消息,System V返回指定优先级的最早消息。
2. 向空队列放置一个消息时,Posix可以产生一个信号或启动一个线程。
2.2 功能函数
mq_open:打开或创建消息队列,除了可选的attr参数外,与open类似。
mq_close:关闭消息队列,与close类似。
mq_unlink:带引用计数的删除,与unlink类似。
mq_getattr和mq_setattr函数:获取和设置消息队列的属性。
struct mq_attr {
long mq_flags; //0或O_NONBLOCK,唯一能被setattr设置的属性
long mq_maxmsg; //最大消息数,创建时指定
long mq_msgsize; //最大消息长度,创建时指定
long mq_curmsgs; //当前消息数,只能获取不能修改
}
2.3 mq_seng和mq_receive
int mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio);
ssize_t mq_receive(mqd_t mqdes, const char *ptr, size_t len, unsigned int *priop);
mq_receive的len参数不能小于消息队列的mq_msgsize的大小。
Posix允许长度为0的消息,但不具备有效标识消息发送者的特性。
2.4 消息队列的限制
1. mq_maxmsg 最大消息数。
2. mq_msgsize 最大消息长度。
3. MQ_OPEN_MAX 同时打开的消息队列的最大数目。
4. MQ_PRIO_MAX 优先级的最多级数。
2.5 mq_notify
mq_notify提供了异步事件通知功能,在某个空消息队列被放置一条消息时,会向注册的进程发送指定信号或启动一个线程。
int mq_notify(mqd_t mqdes, const struct sigevent *notification);
1. 一个队列在任意时刻只有一个进程能够注册这个通知。
2. 只有当前注册通知的进程可以撤销这个注册,方法是传入一个空指针。
3. 因mq_receive而阻塞的进程比注册了通知的进程优先获得消息。
4. 通知被发送到注册进程后,该注册被撤销。
2.6 Posix实时信号
Posix实时信号指值在SIGRTMIN和SIGRTMAX之间的一系列信号,在sigaction调用中指定SA_SIGINFO标志的话,实时信号能提供一些有保证的、可靠的实时行为。
实时行为隐含特性:
1. 信号是排队的,阻塞期间同一信号产生多次,那么解除阻塞后该信号会递交多次。
2. 多个实时信号排队时,值较小的信号优先递交。
3. 实时信号能携带更多信息。
4. 有使用实时信号工作的新函数。