本文是对《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. 第九节,基本条件语句if

    条件语句 如果我们希望有效的响应用户的输入,代码就需要具有判断能力.能够让程序进行判断的结构成为条件,条件判断语句返回的是布尔值真或假,真就执行一条线路,假就执行另外一条线路 注意if判断如果怎样,否 ...

  2. MC 在1分钟图拿出5分钟,15分钟,30分钟,1小时的K线

    using System; using System.Drawing; using System.Linq; using System.Collections; namespace PowerLang ...

  3. login/logout切换

    1. 前端按钮 <img border="0" width="18" height="18" src="<%=base ...

  4. screen 链接远程桌面

    screen     开一个新的screen窗口 screen -ls 查看已经存在的所有screen窗口 screen -r  208111  进入这个窗口 ctrl+a+d  退出screen,回 ...

  5. bind启动时提示953端口被使用

    部署DNS的时候遇到个奇葩的问题,总是提示 couldn't add command channel 0.0.0.0#953: address in use 实际上系统上并没有进程使用953端口.查询 ...

  6. log4net发布时assembly引用错误的问题

    网上的通行配置: 无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句: [assembly: log4net.Config .XmlConfigurator()] ...

  7. spring xsd

    http://ljhzzyx.blog.163.com/blog/static/3838031220132239471608/ spring配置文件报找不到xsd文件错误 2013-03-23 10: ...

  8. yum no key

    http://serverfault.com/questions/525958/redhat-yum-install-gpg-key-retrieval-failed

  9. Petit FatFs

    FatFs is a generic FAT/exFAT file system module for small embedded systems. The FatFs module is writ ...

  10. Java学习笔记之基于TCP协议的socket

    可以一直输入,而不是一问一答: 开两个线程,一个负责收,一个负责发. 1.先运行: package com.zr.javase0825; import java.io.BufferedReader; ...