POSIX消息队列之概述链接方式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

POSIX消息队列之概述链接⽅式
NAME
mq_overview —— POSIX消息队列概述
DESCRIPTION
POSIX消息队列允许进程以消息的形式交换数据。

此API与System V消息队列(msgget(2),msgsnd(2),msgrcv(2)等)有明显不同,但做的事情差不多。

消息队列通过mq_open(3)创建和打开,此函数返回⼀个消息队列描述符(mqd_t),它⽤于之后的调⽤中引⽤打开的消息队列。

每个消息队列由⼀个名字标识,该名字具有这样的格式/somename,亦即,⼀个空字符结尾,以斜线开头,最多跟着NAME_MAX(即255)个字符,并且这些字符都不能是斜线。

若传递相同的名字给mq_open,两个进程可以操作同⼀个队列。

消息通过调⽤mq_send(3)和mq_receive(3)传递。

当⼀个进程结束使⽤该队列,则它调⽤mq_close(3),当⼀个队列不再需要了,则可以调⽤mq_unlink(3)删除。

队列属性可以调⽤mq_getattr(3)/mq_setattr(3)获取/修改。

⼀个进程可以在⼀个空队列上调⽤mq_notify请求消息到达的异步通知。

消息队列描述符引⽤到⼀个打开的消息队列(类⽐open(2))。

fock(2)之后,⼦进程继承⽗进程队列描述符的拷贝,两个描述符都引⽤到⽗进程的那个描述符。

两个进程持有的描述符共享与消息队列描述符相关联的标记(mq_flags)。

每个消息都有⼀个关联的优先级,消息总是从最⾼优先级交给接收进程。

消息优先级范围从0(低优先级)到sysconf(_SC_MQ_PRIO_MAX)-1(⾼优先级)。

Linux下,sysconf(_SC_MQ_PRIO_MAX)返回32768,但是POSIX.1-2001只要求⽀持0到31的优先级即可,许多实现也只提供这个范围。

余下的部分描述⼀些POSIX消息队列在Linux实现上的特殊细节。

库接⼝和系统调⽤
⼤多数情况下,上⾯列出的mq_*()库接⼝对应到的底层的系统调⽤是相同的名字。

对应的情况罗列于下:
库接⼝系统调⽤
mq_close(3) close(2)
mq_getattr(3) mq_getsetattr(2)
mq_notify(3) mq_notify(2)
mq_open(3) mq_open(2)
mq_receive(3) mq_timedreceive(2)
mq_send(3) mq_timedsend(2)
mq_setattr(3) mq_getsetattr(2)
mq_timedreceive(3) mq_timedreceive(2)
mq_timedsend(3) mq_timedsend(2)
mq_unlink(3) mq_unlink(2)
版本
POSIX消息队列在内核2.6.6后⽀持。

Glibc在版本2.3.4后提供⽀持。

内核配置
可通过CONFIG_POSIX_MQUEUE内核配置选项⽀持POSIX消息队列。

此选项默认被启⽤。

持久性
POSIX消息队列具有内核持久性:如果没有调⽤mq_unlink移除,消息队列将在系统关闭之前⼀直存在。

链接
使⽤POSIX消息队列API的程序必须带选项编译cc -lrt以链接到实时库librt。

/proc接⼝
下列接⼝可以⽤于限制内核内存在POSIX消息队列上的消耗量:
/proc/sys/fs/mqueue/msg_max
此⽂件可以⽤于查看和修改在队列中排队消息的数量的上界。

此值可以作为⼀个上限值在传递给mq_open的参数attr->mq_msgmax中给定。

msg_max的默认值是10,最⼩值是1(在内核2.6.28之前是10)。

此值上限是HARD_MAX:131072/sizeof(void*)(x86下是32768)。

特权进程(CAP_SYS_RESOURCE)可以忽略此限制,但是HARD_MAX的上界依然存在。

/proc/sys/fs/mqueue/msgsize_max
此⽂件可以⽤于查看和修改消息⼤⼩最⼤值的上界。

此值可以在attr->mq_msgsize指定并传递给mq_open。

msgsize_max的默认值是
1,048,576(内核2.6.28之前的上限是INT_MAX,x86下为2,147,483,647)。

特权进程(CAP_SYS_RESOURCE)可以忽略此限制。

/proc/sys/fs/mqueue/queues_max
此⽂件可以⽤于查看和修改整个系统上可创建的消息队列的数量的限制值。

⼀旦到达此限制,则只有特权进程(CAP_SYS_RESOURCE)才可以创建新的消息队列。

默认值是256,可以被修改为0到INT_MAX之间的任意值。

资源限制
资源限制RLIMIT_MSGQUEUE,限制属于⼀个有效⽤户ID的所有消息队列消耗的空间量。

参见getrlimit(2)。

挂载消息队列⽂件系统
Linux下,消息队列被创建在虚拟⽂件系统中。

(其它实现可能也提供这样的特性,但细节可能不⼀样)此⽂件系统可以使⽤以下命令挂载(由超级⽤户):
# mkdir /dev/mqueue
# mount -t mqueue none /dev/mqueue
该⽬录的粘连位⾃动被启⽤。

在⽂件系统挂载上去之后,系统上的消息队列就可以像处理⽂件那样⽤命令查看和处理了。

(如ls, rm)
该⽬录的每个⽂件内容由单⾏组成,显⽰队列的有关信息:
$ cat /dev/mqueue/mymq
QSIZE:129 NOTIFY:2 SIGNO:0 NOTIFY_PID:8260
所有的字段如下:
QSIZE 队列中的所有消息所占字节数。

NOTIFY_PID
如果此值⾮0,则表⽰进程PID为此值的进程调⽤mq_notify(3)在此队列上注册了⼀个异步消息通知。

余下的字段描述通知如何发⽣。

NOTIFY 通知⽅式:0是SIGEV_SIGNAL,1是SIGEV_NONE,2是SIGEV_THREAD。

SIGNO ⽤于SIGEV_SIGNAL的信号数值。

轮询消息队列描述符
Linux下,消息队列描述符实际上是⼀个⽂件描述符,可以使⽤select,poll,epoll监视。

但不可移植。

CONFORMING TO
POSIX.1-2001.
NOTES
System V消息队列(msgget(2), msgsnd(2), msgrcv(2), etc.)是⽼⼀些的在进程之间交换消息的API。

POSIX消息队列提供⼀个设计得更好的接⼝,但POSIX消息队列不如System V消息队列那样被⼴泛⽀持。

Linux当前(2.6.26)暂不⽀持对POSIX消息队列的ACLs。

EXAMPLE
⼀个使⽤各种消息队列函数的例⼦在mq_notify(3)中展⽰。

SEE ALSO
getrlimit(2), mq_getsetattr(2), poll(2), select(2), mq_close(3),
mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3),
mq_unlink(3), epoll(7)。

相关文档
最新文档