linux网络编程之posix消息队列
在前面已经学习了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消息队列的更多相关文章
- linux网络编程之posix信号量与互斥锁
继上次学习了posix线程之后,这次来讨论一下posix信号量与互斥锁相关的知识: 跟posix消息队列,共享内存的打开,关闭,删除操作一样,不过,上面的函数是对有名信号量进行操作,通过man帮助可以 ...
- linux网络编程之posix条件变量
今天来学习posix的最后一个相关知识----条件变量,言归正传. 下面用一个图来进一步描述条件变量的作用: 为什么呢? 这实际上可以解决生产者与消费者问题,而且对于缓冲区是无界的是一种比较理解的解决 ...
- linux网络编程之posix线程(一)
今天继续学习posix IPC相关的东东,消息队列和共享内存已经学习过,接下来学习线程相关的知识,下面开始: [注意]:创建失败这时会返回错误码,而通常函数创建失败都会返回-1,然后错误码会保存在er ...
- linux网络编程之posix共享内存
今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的 ...
- linux网络编程之posix线程(二)
继续接着上次的posix线程来学习: 回顾一下创建线程的函数: pthread_att_t属性变量是需要进行初始化才能够用的,一定初始化了属性变量,它就包含了线程的多种属性的值,那到底有哪些属性了,下 ...
- linux网络编程之shutdown() 与 close()函数详解
linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这 ...
- [转]Linux进程通信之POSIX消息队列
进程间的消息队列可以用这个实现,学习了下. http://blog.csdn.net/anonymalias/article/details/9799645?utm_source=tuicool&am ...
- Linux IPC实践(7) --Posix消息队列
1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...
- linux c编程:Posix消息队列
Posix消息队列可以认为是一个消息链表. 有足够写权限的线程可以往队列中放置消息, 有足够读权限的线程可以从队列中取走消息 在某个进程往一个队列写入消息前, 并不需要另外某个进程在该队列上等待消息的 ...
随机推荐
- EC11编码器的使用方法
1. EC11编码器的原理图如下 2. 旋转的时候,波形如下,EC11转1格,产生一个上升沿的中断,思路就是检测AX4-1的上升沿中断(平时是低电平),进入中断服务函数,检测AX4-2的电平,低电平逆 ...
- SSH 连接时间超时
linux服务端 # vi /etc/ssh/sshd_config ClientAliveInterval 60 ClientAliveCountMax 3 # 注: # ClientAliveIn ...
- AJAX-前后端交互的艺术
AJAX-前后端交互的艺术 为什么要用AJAX? 当我们通过提交表单向服务器提交内容,或者进行一些其他操作,均涉及到了与浏览器之间的交互,传统的方式与AJAX方式的处理方法是不同的 传统方式:用户触发 ...
- [HTTPS] - 请求API失败(Could not create SSL/TLS secure channel)之解决
背景 在单元测试中请求 HTTPS API 失败. 异常 Result StackTrace: at System.Web.Services.Protocols.WebClientProtocol. ...
- 《Mysql - Mysql 是如何保证主备一致的?》
一:Mysql 主备的基本原理? - 主备切换流程(M-S 架构) - - 在状态 1 中,客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只是将 A 的更新都同步过来,到本地执行. - ...
- 多线程(10) — Future模式
Future模式是多线程开发中常用常见的一种设计模式,它的核心思想是异步调用.在调用一个函数方法时候,如果函数执行很慢,我们就要进行等待,但这时我们可能不着急要结果,因此我们可以让被调者立即返回,让它 ...
- English Grammar in Use - Part1 Present and past
Unit 1 Present continuous (I am doing) A) Am/is/are + -ing is the Present continuous. B) I am doing ...
- 使用postman mock server
需要写一个小的Java程序,用来调用云平台的接口 由于云平台的接口程序还没有写好,只能用模拟的方式先行开发代码, 用了post来模拟接口程序. 需要模拟的接口如下: ■请求地址 /openapi/ip ...
- hdu 6185 递推+矩阵快速幂
思路:考虑全部铺满时,前2列的放法.有如下5种情况:(转自http://blog.csdn.net/elbadaernu/article/details/77825979 写的很详细 膜一下) 假设 ...
- 表单送件按钮代码(一)cs(C#)(未完)
protected void BtnRequest_Clich(object sender, EventArgs e) { lblMsg.Text= " " ; lblfmsg.T ...