在前面已经学习了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. FreeRTOS 时间片,外部中断,任务优先级的一个疑问

    时间片1ms 假设有两个任务,A和B,A任务等待中断里面发出的信号量,B任务在运行 此时,B任务运行了300us的时候中断发生,发出信号量,那么任务A接收到信号量,A任务优先级高,A任务运行 有个问题 ...

  2. jvm(1)---java内存结构

    jvm主要由三个子系统构成:类加载子系统,运行时数据区,执行引擎 运行时数据区主要包括: 1.本地方法栈:登记native方法,执行时加载本地方法库 2.程序计数器:就是一个指针,用来存储指向下一条执 ...

  3. SPSS 2019年10月17日 21:46:38 今日学习总结

    数据库: 开放数据库链接是为了解决异构数据库间的数据共享而产生的,现已成为WOSA的主要部分和基于Windows环境的一种数据库访问接口标准ODBC为异构数据库访问提供一个接口,允许应用程序以SQL为 ...

  4. linux 软连接【转】

    https://www.cnblogs.com/kex1n/p/5193826.html这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个 ...

  5. 使用Maven为SpringBoot项目打包

    一.maven通过命令行打jar包 进入项目目录,执行如下命令: mvn -Dmaven.test.skip -U clean package 发现报如下错误: [ERROR] Failed to e ...

  6. windows强大的快捷键

    1 电脑锁屏 有些时候,需要暂时离开座位去处理其他事,可是电脑还有数据再跑. 关掉的话,数据就白跑了,不关的话,又不想让别人看到我电脑的资料. 那么就按住windows键后,再按L键. 这样电脑就直接 ...

  7. jvm误区--动态对象年龄判定

    原文链接:https://blog.csdn.net/u014493323/article/details/82921740 虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThres ...

  8. twemproxy配置

    redis多主从,多节点,读写分离架构. nutcracker.yml的twemproxy配置 #redis_main是twemproxy所控制redis主从集群逻辑名称 redis_main: #t ...

  9. 自己实现CountDownLatch

    自己实现的CountDownLatch ,只是模拟他的功能而已.jdk中的实现采用的是AQS public class MyCountDownLatch { private final int tot ...

  10. [转帖]Apache Kylin 概述

    Apache Kylin 概述 https://www.cnblogs.com/xiaodf/p/11671095.html 1 Kylin是什么 今天,随着移动互联网.物联网.AI等技术的快速兴起, ...