消息队列 链接

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/mymqQSIZE: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)

COLOPHON
This page is part of release 3.23 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.

时间: 2024-08-15 19:52:52

消息队列 链接的相关文章

【转】MSMQ 微软消息队列 简单 示例

MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理. 我个人的理解,你可以把他当做一种,把数据打包后,发送到一个地方,程序也可以去取到这个打包的程序,队列的机制就不讲了,并发问题荡然无存.呵呵. 上代码: 首先 using System.Messaging; public class MsmqManagerHe

消息队列

1.为什么需要消息队列?当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异. 举个例子:业务系统触发短信发送申请,但短信发送模块速度跟不上,需要将来不及处理的消息暂存一下,缓冲压力. 再举个例子:调远程系统下订单成本较高,且因为网络等因素,不稳定,攒一批一起发送. 再举个栗子,交互模块5:00到24:00和电商系统联通,和内部ERP断开.1:00到4:00和ERP联通,和电商系统断开. 再举个例子,服务员点菜快,厨师做菜慢. 再举个例子,到

消息队列(二)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka). 四.JMS消息服务 讲消息队列就不得不提JMS .JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建.发送.接收和读取消息.它使分布式通信耦合度更低,消息服务更加可靠以及异步性. 在EJB架构中,有消息bean可以无缝的与JM消息服务集成.在J2EE架构模

大型网站架构系列:消息队列

出处:ITFLY8 网址:http://www.cnblogs.com/itfly8/p/5156155.html 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间件. 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等. 二.消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景.异

大型网站架构系列:消息队列(二)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本

消息队列的理解总结

消息队列可实现系统的分布式处理:将业务流程解耦,使得业务处理更专一:可异步处理,不必等待耗时操作完成等. 关于消息队列的介绍,可参考http://kb.cnblogs.com/page/510354/ 1.消息队列的逻辑处理流程 类似设计模式中的“观察者模式(Observer)”或“发布-订阅模式(Pub-Sub)”. “生产者”生成和发送消息到“消息队列”,“消费者”从“消息队列”中取走消息进行处理,使用消息将“生产者”和“消费者”之间的操作关联解耦,易于扩展. 消息队列的应用场景可参考htt

Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用

posix消息队列与system v消息队列的差别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则可以返回任意指定优先级的消息. (2)当往一个空队列放置一个消息时,posix消息队列允许产生一个信号或启动一个线程,system v消息队列则不提供类似机制. 队列中的每个消息具有如下属性: 1.一个无符号整数优先级(posix)或一个长整数类型(system v) 2.消息的数据部分长度(可以为0) 3.数据本身(如果长度大于0) Posix消息队

Posix消息队列

一.函数 mq_open 头文件 mqueue.h: 原型 mqd_t mq_open(const char *name, int oflag, .../*mode_t mode,struct mq_attr* attr*/); 函数功能 创建消息队列: 参数 name :消息队列的名字,根据消息队列的规则,为了更好的可移植性,该名字必须以‘/’开头,创建一个消息队列的时候无须路径,给出名字就好,其存放位置可有自己指定(创建前后都可以). oflag:O_RDONLY(只读) O_WRONLY(

进程间通信(6) - 消息队列posix

1.前言 本篇文章的所有例子,基于RHEL6.5平台(linux kernal: 2.6.32-431.el6.i686). 2.介绍 消息队列是先进先出FIFO原则. 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权限的进程则可以从消息队列中读走消息.消息队列是随内核持续的. 目前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列,System V消息队列目前被