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)

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/.

POSIX 消息队列 之 概述 链接方式的更多相关文章

  1. Posix消息队列

    转载于:http://blog.csdn.net/zx714311728/article/details/53197196 1.消息队列 消息队列可以认为是一个消息链表,消息队列是随内核持续的.队列中 ...

  2. Linux IPC实践(7) --Posix消息队列

    1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...

  3. linux c编程:Posix消息队列

    Posix消息队列可以认为是一个消息链表. 有足够写权限的线程可以往队列中放置消息, 有足够读权限的线程可以从队列中取走消息 在某个进程往一个队列写入消息前, 并不需要另外某个进程在该队列上等待消息的 ...

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

    posix消息队列与system v消息队列的区别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则能够返回随意指定优先级的消息. (2)当往一个空队列放 ...

  5. linux网络编程之posix消息队列

    在前面已经学习了System v相关的IPC,今天起学习posix相关的IPC,关于这两者的内容区别,简单回顾一下: 而今天先学习posix的消息队列,下面开始: 接下来则编写程序来创建一个posix ...

  6. 第5章 Posix 消息队列

    5.1 概述 消息队列可以认为是一个链表.有写权限的线程可往消息队列中放置消息,有读权限的线程可以从消息队列中取走消息. 消息队列和管道/FIFO的区别: (1)消息队列往一个队列中写消息前,并不需要 ...

  7. Posix消息队列实现机制

    本文是对<Unix 网络编程 卷2:进程通信>的笔记. 引言 消息队列是进程间通信的一种方式,可是如果不理解他的实现原理,会有众多不理解之处,下面就结合本书中的例子,对posix消息队列来 ...

  8. 进程间通信--POSIX消息队列

    相关函数: mqd_t mq_open(const char *name, int oflag); mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, si ...

  9. POSIX 消息队列 和 系列函数

    一.在前面介绍了system v 消息队列的相关知识,现在来稍微看看posix 消息队列. posix消息队列的一个可能实现如下图: 其实消息队列就是一个可以让进程间交换数据的场所,而两个标准的消息队 ...

随机推荐

  1. html frameset的介绍

    frameset 元素可以定义一个框架集.它被用来组织多个窗口(框架).每个框架存有独立的文档. 属性 ①border 设置框架的边框粗细. ②bordercolor 设置框架的边框颜色. ③fram ...

  2. 【转载】maven用处

    http://bbs.csdn.net/topics/80014314 当您的项目逐渐变得庞大和复杂时,最好使用一种构建工具来自动构建您的项目.例如,一个典型的java项目,每次构建时都要经历编译ja ...

  3. sublime text3的快捷键

    Ctrl + Shift + P    调出命令板(Command Palette) Ctrl + `    调出控制台 Ctrl + D    选择当前光标所在的词并高亮该词所有出现的位置,再次 C ...

  4. 难度2:ASCII码排序

    ASCII码排序 难度:2描述: 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入: 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据 ...

  5. 如何在<textarea>标签中使用并解析HTML标签

    例如: <textarea name="intro" placeholder="请输入内容" maxlength="800">& ...

  6. Android输入法框架系统(上)

    输入法,就是用来输入字符(包括英文,俄文,中文)的工具.输入法你可以看成是一种字符发生器,它将输入数据触摸事件或者按键事件转化为其他更丰富的字符.在PC时代,输入法的原始输入来自实体键盘,鼠标,然后输 ...

  7. LARC Caffe笔记(二) 训练自己的img

    继看完 贺完结!CS231n官方笔记 上一次已经成功跑起caffe自带的例程,mnist和cifar10 但是终归用的是里面写好的脚本,于是打算训练自己的img 〇.目标 准备好food图片3类(出于 ...

  8. 【转】重装win7后,所有USB接口无法使用(鼠标、键盘、U盘)

    转自:https://blog.csdn.net/u010887744/article/details/45270245 今天给一朋友重装系统,华硕FX50J,修改BIOS重装了win7,结果所有US ...

  9. iOS8 对开发者来说意味着什么?

    今天凌晨,Apple WWDC2014 iOS8 正式推出! 也许,对于广大iOS用户来说,iOS8的创新并不是特别多. 但对于开发者来说,影响却将会是无比巨大的! 正如Apple官网上的广告:Hug ...

  10. Javascript鼠标事件大全

    事件 浏览器支持 描述 onClick IE3|N2|O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDblClick IE4|N4|O 鼠标双击事件 onMouseDown IE4|N ...