在前面已经学习了System v相关的IPC,今天起学习posix相关的IPC,关于这两者的内容区别,简单回顾一下:

而今天先学习posix的消息队列,下面开始:

接下来则编写程序来创建一个posix消息队列:

下面来编译运行一下:

这是为什么呢?其实在man帮助中有说明:

所以,修改一下Makefile文件,加上这个链接选项:

再来运行一下:

posix消息队列创建成功了,下面来查看一下:

这是为什么呢?原因是由于ipcs只能查看System v创建的消息队列,而poix创建的消息队列不能通过这个方式来查看,那到底存放在哪里呢?还是回到强大的man帮助手册来找寻答案:

所以接下来创建一个挂载点:

接下来将消息队列虚拟文件系统挂载到该目录下:

所以来看一下目前我们所创建的消息队列的状态:

如果要想再次看到,则需重新挂载一次既可。

在创建posix消息队列时,我们指定了一个消息队列名字,如下:

其中该名字是有一定的规则的,所以接下来说明一下

接下来要学习的一个函数比较简单,关闭消息队列:

【说明】:它的更准备的含义是删除一个连接数,直接连接数减为0的时候才真正将文件删除。

下面来编写程序来使用一下:

编译运行:

其中stuct mq_attr结构体为:

下面来编译程序来获取一下消息队列的属性:

编译运行:

另上设置属性的用法类似,这里就不编写了。

接下来利用这个函数来向消息队列中发送消息:

下面来编译运行:

另外也可以用我们自己编写的查看属性的程序来查看此时的属性:

现在创建的消息队列中已经发送了一个消息了,接下来将从消息队列中来获取已发送的消息:

下面编译运行:

这是为什么呢?

而最大长度大小可以通过mq_attr函数来获取,所以修改一个代码:

下面再次编译运行:

下面重新再来发送多个消息,再接收:

没有消息了,接收则会被阻塞,从运行效果中可以看出。

从函数字面意思来看是一个通知,当消息队列从没消息到有消息会得到通知,这个是System V跟Posix消息队列的一个非常明显的区别,就是SystemV消息队列是没法得到这个通知的,而Posix消息队列是可以的,也就是目前消息队列是空的,当某个进程或线程往消息队列发送一条消息时,这时消息队列则会给出通知,只要进程注册了该通知事件,而注册通知就可以通过mq_notify函数完成,具体如下:

其中用到的结构体:

可以查看一下man帮助:

这里主要关注信号的方式,因为线程目前还没有学到:

下面编写程序来演示一下通知的效果:

接下来注册一个消息队列的通知事件:

当收到通知时,这时来处理一下信号处理程序:

另外,为了看到通知效果,这里需要不让进程退出,所以死循环一下:

下面编译运行来看下效果:

从中发现,当空的消息队列里面新发送了一条消息,则立马就收到通知了,那如果继续再发送呢?

这是为什么呢?其实这个通知是有一定规则的,如下:

要想让每次发送都收到通知,则上面的第三点则是解决方案,下面来修改一下程序:

下面再来看下效果:

从中可以发现,这次确实是每次发送消息都能被通知到了,那规则中提到,重新注册必须放到接收消息之前,不能放在之后:

这是为什么呢?这时因为当发送一个消息时,被接收了之后,消息队列里面就为空了,这时再次注册就无法接收到通知了,所以得放在接收消息之前再次注册。

最后来说明一下在上面提到过需要解释的:

正好可以利用这个通知程序来说明,如下:

关于Posix的消息队列就学到这,下次继续~

linux网络编程之posix消息队列的更多相关文章

  1. linux网络编程之posix信号量与互斥锁

    继上次学习了posix线程之后,这次来讨论一下posix信号量与互斥锁相关的知识: 跟posix消息队列,共享内存的打开,关闭,删除操作一样,不过,上面的函数是对有名信号量进行操作,通过man帮助可以 ...

  2. linux网络编程之posix条件变量

    今天来学习posix的最后一个相关知识----条件变量,言归正传. 下面用一个图来进一步描述条件变量的作用: 为什么呢? 这实际上可以解决生产者与消费者问题,而且对于缓冲区是无界的是一种比较理解的解决 ...

  3. linux网络编程之posix线程(一)

    今天继续学习posix IPC相关的东东,消息队列和共享内存已经学习过,接下来学习线程相关的知识,下面开始: [注意]:创建失败这时会返回错误码,而通常函数创建失败都会返回-1,然后错误码会保存在er ...

  4. linux网络编程之posix共享内存

    今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的 ...

  5. linux网络编程之posix线程(二)

    继续接着上次的posix线程来学习: 回顾一下创建线程的函数: pthread_att_t属性变量是需要进行初始化才能够用的,一定初始化了属性变量,它就包含了线程的多种属性的值,那到底有哪些属性了,下 ...

  6. linux网络编程之shutdown() 与 close()函数详解

    linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这 ...

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

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

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

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

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

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

随机推荐

  1. 利用ldirectord实现lvs后端realserver健康状态检查

    ldirectord用来实现LVS负载均衡资源在主.备节点间的故障转移.在首次启动时,ldirectord可以自动创建IPVS表.此外,它还可以监控各RealServer的运行状态,一旦发现某Real ...

  2. github账户初始化设置

    1.首先在github官网https://github.com/上注册自己的账户: 2.去git官网https://git-scm.com/downloads,根据电脑系统下载合适的版本并安装. 3. ...

  3. Charles 抓包配置

    本文参考:charles 抓包配置 proxy setting (代理设置) 设置的主界面如下: 动态端口 启用动态端口选项来监听动态端口,每次查询启动时选择.这样可以避免与计算机上可能运行的其他网络 ...

  4. Linux 脚本语言入门

    0.脚本编写初步介绍 (1)脚本第一行以 #!/bin/sh 开始,也可以用 #!/bin/bash 开始,但是第一行必须以这种方式开始. (2)脚本名需要以.sh结尾 (3)#开头的句子表示注释 ( ...

  5. Python-21-socket编程

    一.基础知识 1. C/S架构 C/S架构即客户机/服务器模式. 它可以分为客户机和服务器两层: 第一层:  在客户机系统上结合了界面显示与业务逻辑: 第二层:  通过网络结合了数据库服务器. 简单的 ...

  6. ~postman基础断言方法

    postman官方文档:https://learning.getpostman.com/docs/postman/scripts/test_examples/ 断言1:检查响应主体是否包含字符串 // ...

  7. python离线安装外部库(第三方库)

    在官网下好外部库,解压后,点击解压后的文件夹,按住shift 右击在命令行中执行 输入 python setup.py install

  8. PAT甲级题分类汇编——图

    本文为PAT甲级分类汇编系列文章. 图,就是层序遍历和Dijkstra这一套,#include<queue> 是必须的. 题号 标题 分数 大意 时间 1072 Gas Station 3 ...

  9. java-version不是内部或外部命令的问题

    有时java-version的错误并不一定是环境配置的问题 ,可能是粗心的问题 运行——cmd——输入java -version 看清.java命令后是有个空格的 -version应该只是参数而已 我 ...

  10. Istio旨在成为容器化微服务的网格管道

    在精彩的软件容器世界中,当新项目涌现并解决你认为早已解决的问题时,这感觉就像地面在你的脚下不断地移动.在许多情况下,这些问题很久以前被解决,但现在的云原生架构正在推动着更大规模的应用程序部署,这就需要 ...