Posix消息队列实现机制
本文是对《Unix 网络编程 卷2:进程通信》的笔记。
引言
消息队列是进程间通信的一种方式,可是如果不理解他的实现原理,会有众多不理解之处,下面就结合本书中的例子,对posix消息队列来一个说明。
1、消息队列是进程间通信,那谁来保证他们的进程互斥共享呢,即读写不交叉?
2、消息队列异步通信机制(解释:异步通信是一个进程A需要读消息队列,但是队列是空的,又不想阻塞,那么当进程B给消息队列送入消息之后谁来通知A消息队列已经有消息了呢)是如何实现的呢?
3、消息队列结构(本文用存储映射I/O实现消息队列)?

Posix消息队列内核结构
这个地方由于使用画图软件不太友好,剩下的几个消息结构不能展现出来了。基本上属性的作用在途中已经标明,对于之前提出的几个问题,相信你能够通过这个图来自己给出答案。
几个重要的函数实现
mq_open() 打开一个文件,并进行存储映射,将这个内存实现为消息队列的结构。当然里面还是有很多细节的。有兴趣的可以看看这本书上给出的源码。
mq_close() 关闭消息队列,释放存储映射内存和消息队列描述符所占用的内存。
mq_getattr() mq_setattr() 这内部实现还是要用到互斥锁,因为获取属性的时候,不希望有线程去修改他的属性;同理,设置属性的时候,不希望有线程区读取他的属性。
mq_send() mq_receive() 这个内部实现不仅要用到互斥锁还要用到条件变量。互斥锁是用来保证只有一个线程操作消息队列,条件变量和互斥锁结合起来是用来当消息队列空的时候,有进程读,就会陷入阻塞,当消息队列为慢的时候,有进程想要写,就会陷入阻塞,这个时候条件变量就可以用来互相唤醒了。
mq_notify() 这个函数是用来实现消息队列由空变为非空的时候,给一个注册进程发送通知(内部通过kill函数给这个注册进程发送信号进行异步通知)。进程调用这个函数就会被注册到消息队列中。任意时刻,只有一个进程能注册到为接收某个队列的通知。
Posix消息队列实现机制的更多相关文章
- Linux IPC POSIX 消息队列
模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...
- Posix消息队列
转载于:http://blog.csdn.net/zx714311728/article/details/53197196 1.消息队列 消息队列可以认为是一个消息链表,消息队列是随内核持续的.队列中 ...
- 进程间通信--POSIX消息队列
相关函数: mqd_t mq_open(const char *name, int oflag); mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, si ...
- Unix IPC之Posix消息队列(1)
部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/ar ...
- Posix消息队列注意事项
随内核的持续性 读总是返回最高优先级的最早消息. 当往一个空队列放置一个消息时,允许产生一个信号或启动一个线程. 可认为是一个消息链表 队列中每个消息具有 1.一个无符号整数优先级 2.消息的数据部分 ...
- [转]Linux进程通信之POSIX消息队列
进程间的消息队列可以用这个实现,学习了下. http://blog.csdn.net/anonymalias/article/details/9799645?utm_source=tuicool&am ...
- Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
posix消息队列与system v消息队列的区别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则能够返回随意指定优先级的消息. (2)当往一个空队列放 ...
- 第5章 Posix 消息队列
5.1 概述 消息队列可以认为是一个链表.有写权限的线程可往消息队列中放置消息,有读权限的线程可以从消息队列中取走消息. 消息队列和管道/FIFO的区别: (1)消息队列往一个队列中写消息前,并不需要 ...
- posix 消息队列
注意 在涉及到posix消息的函数时, gcc 编译时要加-lrt参数, 如 gcc -lrt unpipc.c mqpack.c send.c -o send gcc -lrt unpipc.c m ...
随机推荐
- shell脚本学习(二)
4.cat命令 1) cat -s 摆脱多余的空白行 2) cat -T 将制表符显示为^I 3) cat -n 显示行号 4) cat -b 跳过空白行,然后显示行号 ...
- Git撤销暂存区stage中的内容
$ git add readme.txt提交到了stage中. $ git statusOn branch masterChanges to be committed: (use "git ...
- 经典.net面试题目(2)
101.在.net(C# or vb.net)中如何取消一个窗体的关闭. 答:private void Form1_Closing(object sender, System.ComponentMod ...
- Floodfill算法——求独立子图个数
Floodfill--漫水填充法(也称种子填充法)简单来说就是求一个图中独立子图的个数并将其描述出不同的状态.Floodfill在计算机图形学有着非常广泛的运用,比如图像分割.物体识别之类.基于Flo ...
- MyEclipse运行到断点也跳过的问题
如果是B/S开发也就是javaWeb开发的话,Tomcat 的启动模式要设置成Debug模式 还有下面是没运行时断点的样子: 运行的时候,断点会变成对钩,表示执行到它所在代码的时候会停下来:
- C#之控制台输入和输出
控制台输出 C# 控制台程序一般使用 .NET Framework Console 类提供的输入/输出服务.Console.WriteLine("Hello World!"); 语 ...
- 取得GridView某行的DataKey
首先绑定DataKeyNames GridView.DataKeyNames = new string[] { "字段名称" }; 取值 string aaa= GridView. ...
- set -x /set +x(linux)
Linux 脚本中生成日志 set -x Posted on 2012-07-25 09:44 紫冰龙 阅读(3946) 评论(0) 编辑 收藏 set -x 与 set +x 在liunx脚本中可用 ...
- Sticks<DFS>
题意: 给n个木棍,这些木棍是由m个长度均为L的木棍切割而来,求L的最小值. 思路: DFS+剪枝. 剪枝: 1:L的取值范围在n(max)和n(sum)之间,逐个枚举.sum%L!=0则L不能用. ...
- liunx 定时执行 php文件
which php 寻找php路径