当前位置:嗨网首页>书籍在线阅读

14-消息队列限制

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

52.8 消息队列限制

SUSv3为POSIX消息队列定义了两个限制。

MQ_PRIO_MAX

在52.5.1中已经对这个限制进行了介绍,它定义了一条消息的最大优先级。

MQ_OPEN_MAX

一个实现可以定义这个限制来指明一个进程最多能打开的消息队列数量。SUSv3要求这个限制最小为_POSIX_MQ_OPEN_MAX(8)。Linux并没有定义这个限制,相反,由于Linux将消息队列描述符实现成了文件描述符(52.7节),因此适用于文件描述符的限制将适用于消息队列描述符。(换句话说,在Linux上,每个进程以及系统所能打开的文件描述符的数量限制实际上会应用于文件描述符数量和消息队列描述符数量之和。)更多有关适用的限制的细节信息请参考36.3节中对RLIMIT_NOFILE资源限制的讨论。

除了上面列出的由SUSv3规定的限制之外,Linux还提供了一些/proc文件来查看和修改(需具备特权)控制POSIX消息队列的使用的限制。下面这三个文件位于/proc/sys/fs/ mqueue目录中。

msg_max

这个限制为新消息队列的mq_maxmsg特性的取值规定了一个上限(即使用mq_open()创建队列时attr.mq_maxmsg字段的上限值)。这个限制的默认值是10,最小值是1(在早于2.6.28的内核中是10),最大值由内核常量HARD_MSGMAX定义,该常量的值是通过公式(131072 / sizeof(void *))计算得来的,在Linux/x86-32上其值为32768。当一个特权进程(CAP_SYS_RESOURCE)调用mq_open()时msg_max限制会被忽略,但HARD_MSGMAX仍然担当着attr.mq_maxmsg的上限值的角色。

msgsize_max

这个限制为非特权进程创建的新消息队列的mq_msgsize特性的取值规定了一个上限(即使用mq_open()创建队列时attr.mq_msgsize字段的上限值)。这个限制的默认值是8192,最小值是128(在早于2.6.28的内核中是8192),最大值是1048576(在早于2.6.28的内核中是INT_MAX)。当一个非特权进程(CAP_SYS_RESOURCE)调用mq_open()时会忽略这个限制。

queues_max

这是一个系统级别的限制,它规定了系统上最多能够创建的消息队列的数量。一旦达到这个限制,就只有特权进程(CAP_SYS_RESOURCE)才能够创建新队列。这个限制的默认值是256,其取值可以为范围从0到INT_MAX之间的任意一个值。

Linux还提供了RLIMIT_MSGQUEUE资源限制,它可以用来为属于调用进程的真实用户ID的所有消息队列所消耗的空间规定一个上限,细节信息请参考36.3节。