本文是对《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消息队列实现机制的更多相关文章

  1. Linux IPC POSIX 消息队列

    模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...

  2. Posix消息队列

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

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

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

  4. Unix IPC之Posix消息队列(1)

    部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/ar ...

  5. Posix消息队列注意事项

    随内核的持续性 读总是返回最高优先级的最早消息. 当往一个空队列放置一个消息时,允许产生一个信号或启动一个线程. 可认为是一个消息链表 队列中每个消息具有 1.一个无符号整数优先级 2.消息的数据部分 ...

  6. [转]Linux进程通信之POSIX消息队列

    进程间的消息队列可以用这个实现,学习了下. http://blog.csdn.net/anonymalias/article/details/9799645?utm_source=tuicool&am ...

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

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

  8. 第5章 Posix 消息队列

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

  9. posix 消息队列

    注意 在涉及到posix消息的函数时, gcc 编译时要加-lrt参数, 如 gcc -lrt unpipc.c mqpack.c send.c -o send gcc -lrt unpipc.c m ...

随机推荐

  1. vb脚本自动更新版本信息

    使用的串口显示软件为secureCrt,支持脚本功能,今天写了一个简单的软件升级脚本(VB脚本). 如下: # $language = "VBScript" # $interfac ...

  2. AC_CONFIG_HEADER

    configure.in里有宏AC_CONFIG_HEADER()时用. AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用.

  3. 【Machine Learning in Action --2】K-近邻算法改进约会网站的配对效果

    摘自:<机器学习实战>,用python编写的(需要matplotlib和numpy库) 海伦一直使用在线约会网站寻找合适自己的约会对象.尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的 ...

  4. js获取url传递参数,js获取url?号后面的参数

    方法一.正则表达式 function getQueryString(name) { var reg = new RegExp("(^|&)" + name + " ...

  5. MySQL SQL优化——分片搜索

    DELIMITER $$ DROP PROCEDURE IF EXISTS `test_release`.`Sp_JP_A_NotifyBegin`$$ CREATE DEFINER=`encysys ...

  6. HDU 2802 F(N)(简单题,找循环解)

    题目链接 F(N) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  7. Lucene4.X 高级应用

    Lucene 简介以及使用 Lucene, 一个基于 Java 的开源的全文搜索工具包,可以方便的嵌入到各种应用系统中,实现针对应用的全文索引以及检索功能.目前是 Apache  jakarta 项目 ...

  8. 5--OC--构造方法

    //  Created by Stephen on 16/3/2.//  Copyright © 2016年 Stephen. All rights reserved.//// 回顾上一章节Perso ...

  9. andorid 自定义view属性declare-styleable

    1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> <attr name = &quo ...

  10. Oracle Sql优化之Merge 改写优化Update

    1.待改写语句如下 update table1 f )),) ,),)), f.jine2 )),) from table2 e where e.kjqj=f.kjqj=e.gs=f.gs and e ...