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 ...
随机推荐
- RESTful架构1--架构理解
转自:理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时( ...
- js 条件判断放大字体
<html> <head> <meta charset="utf-8" /> <title></title> <s ...
- HDU 1548 A strange lift(dij+邻接矩阵)
( ̄▽ ̄)" //dijkstra算法, //只是有效边(即能从i楼到j楼)的边权都为1(代表次数1): //关于能否到达目标楼层b,只需判断最终lowtime[b]是否等于INF即可. # ...
- 【超级干货】手机移动端WEB资源整合:转载
转载于:http://www.w3cfuns.com/notes/24611/fbba9cbd616e795360ea45515494aa53.html meta基础知识 H5页面窗口自动调整到设备宽 ...
- go share library
http://blog.ralch.com/tutorial/golang-sharing-libraries/ Sharing Golang packages to C and Go Sun, Au ...
- openCV(一)---将openCV框架导入iOS工程中
开发环境: Xcode 6.4 openCV for iOS 3.0 配置openCV开发环境 在OpenCV官网中下载OpenCV开发包(官网地址:http://opencv.org/) ...
- 基于Win32 SDK实现的一个简易线程池
利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...
- MySQL 异常错误码使用 及 对照表
DECLARE CONTINUE HANDLER FOR SQLWARNING, SQLEXCEPTION, NOT FOUND BEGIN GET DIAGNOSTICS CONDITION cod ...
- zTree异步加载并初始化树时全部展开(贴主要代码)
<%@page pageEncoding="UTF-8"%> <%@include file="/commons/include/html_doctyp ...
- UIViewContentMode 图文解说
在iOS应用开发中我们常常要对视图的contentMode属性进行设置,尤其在使用UIImageView视图时设置这个属性的概率很高.我们知道contentMode的类型是UIViewContentM ...