在前面已经学习了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. 【C# 开发技巧】 c#窗体关于调试界面和运行界面不一样的原因之一

    如下图所示: 原因是因为主窗体属性AutoScaleMode设置为:Font了: 按自己需求将AutoScaleMode设置修改即可. 另外一个可能是系统显示-缩放与布局-要调整到100% 如下图:

  2. k8s中configmap的使用方法

      ConfigMaps允许您将配置构件与映像内容解耦,以保持容器化应用程序的可移植性.本文展示如何创建configmap,修改configmap以及如何把configmap应用于pod. 创建con ...

  3. .net字符串内存的分配

    几次面试中遇到都有类似的问题,就是 string str = "aa" + "bb" + "ccc";进行了几次内存分配? 1 class ...

  4. stl 自定义排序与删除重复元素

    转: STL—vector删除重复元素 STL提供了很多实用的算法,这里主要讲解sort和unique算法. 删除重复元素,首先将vector排序. sort( vecSrc.begin(), vec ...

  5. LeetCode 718. 最长重复子数组(Maximum Length of Repeated Subarray)

    718. 最长重复子数组 718. Maximum Length of Repeated Subarray 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s,找出该数组中满足其和 ≥ s 的 ...

  6. Git操作入门

    生成ssh key: ​ ssh-keygen -t rsa -C "lkt@temp.com" ​ 按三次回车,最后在.ssh文件夹下得到id_rsa和id_rsa.pub两个文 ...

  7. cookie设置中文时的编码问题

    cookie设置中文时的编码问题:cookie在设置时不允许出现中文.非要设置中文的怎么办,看下面的解决方案: 方式1 def login(request): ret = HttpResponse(' ...

  8. Linux基础-01-Linux基础命令

    1. Linux命令的格式 1) Linux命令的语法格式: 命令 [选项] [参数] 2) 命令格式中命令.选项.参数的具体含义 a) 命令:告诉Linux(UNIX)操作系统做(执行)什么. b) ...

  9. Linux下交换文件说明

    vi写文件,没有保存就关闭,会自动生成一个后缀为.swp的交换文件(隐藏文件),保存了前面写的内容 先利用R恢复,在删除这个交换文件 涉及到的命令 ls –a rm .xxx.swap -rf 

  10. unittest之makeSuite\testload\discover及测试报告teseReport

    转载:http://www.cnblogs.com/sunny0/p/7771089.html 测试套件suite除了使用addTest以外,还有使用操作起来更更简便的makeSuite\testlo ...