linux网络编程之system v消息队列(一)
经过上次对于进程通讯的一些理论的认识之后,接下来会通过实验来进一步加深对进程通讯的认识,话不多说,进入正题:
其实还可以通过管道,但是,管道是基于字节流的,所以通常会将它称为流管道,数据与数据之间是没有边界的;而消息队列是基于消息的,数据与数据之间是有边界的,这是消息队列跟管道有区别的地方,另外一个差别就是在于接收:消息队列在接收是不一定按先入先出,而管道一定是按照先入先出的原则来进行接收的。
关于这些,可以通过命令来查看其值,如下:
上次提到过,System_V IPC对象有三种,如下:
这些IPC对象都是随内核持续的,也就是说当访问这些对象的最后一个进程结束时候,内核也不会自动删除这些对象,直到我们显示删除这些对象才能够从内核中删除掉,所以说内核必须为每个IPC对象维护一个数据结构,其形式如下:
下面来看下消息队列的具体结构是怎么样的:
这里先学前两个函数:
下面则用代码来学习一下该函数:
下面编译运行一下:
从图中可以看出创建失败了,这是为什么呢?这时可以查看其帮助:
实际上msgget函数类似于open函数一样,如果在open一个文件时没有指定O_CREATE选项,则不能够创建一个文件,同样的:
如果创建失败,则会返回:
所以修改代码如下:
再次编译运行:
那创建成功的消息队列怎么查看呢?可以通过如下命令:
如果再次运行呢?
发现又成功了,那再查看一下消息队列:
修改代码如下:
其错误代码是:
可见每运行一次则就创建成功一个新的消息队列,而且key都是为0,这意味着两个进程就无法共享同一个消息队列了,但是同一个进程还是可以共享的,其实也可以有一个办法达到两个不同进程进行共享,就是将消息队列id保存到文件当中,另一个进程读取消息队列id来获得消息队列,这样也能实现共享,只是麻烦一些,这里就不多赘述了。另外如果key值为IPC_PRIVATE,那么没有IPC_CREATE选项也一样会创建成功,如下:
编译运行:
另外一旦一个消息队列创建成功之后,如果要打开一个消息队列,这时候就不用指定IPC_CREATE了,而且参数值可以直接填0:
接下来删除一些已经创建的消息队列,有两种方式:
那如果像这剩下key全为0的,用这种方式还能起作用么,咱们来试一下:
下面来说一个权限的问题:
编译运行:
下面来以600更高的权限来打开刚才创建低权限的消息队列:
那有木有一种办法,在打开消息队列时,就以原创建的权限打开,当然有,也就是打开时不指定权限既可,如下:
上面演示了各种msgget创建用法,下面来用图来总结一下各个情况:
接下来学习一下消息队列的按制函数,如下:
上面已经用命令知道怎么删除已经创建的消息队列了,下面采用代码来实现消息队列的删除:
接下来来获取消息队列的信息,这时需要就需要关注第三个参数了,man查看一下:
而其中ipc_perm结构体内容如下:
下面来实验一下:
编译运行:
下面来更改一下消息队列的状态,将权限666改为600,具体做法如下:
【说明】:上图中用到了sscanf函数来将一个指定的字符串赋值给变量,对于scanf函数大家应该都不陌生,它是从标准输入中赋值变量,而sscanf是将指定的字符串按指定的格式赋给变量,两者的唯一区别就是数据的来源变了,很容易理解。
编译运行:
好了,今天的内容有些多,需好好消化,下节消息队列继续~~
linux网络编程之system v消息队列(一)的更多相关文章
- linux网络编程之system v消息队列(二)
今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...
- linux网络编程之system v信号量(一)
今天起,学习信号量相关的知识,下面开始: 关于信号量,在前面已经介绍过了,这里回顾一下: 通过上面的描述,很容易就能想到信号量的一上数据结构: 下面再来回顾一下P.V原语: 所谓的原语就是指这段代码是 ...
- linux网络编程之system v共享内存
接着上次的共享内存继续学习,这次主要是学习system v共享内存的使用,下面继续: 跟消息队列一样,共享内存也是有自己的数据结构的,system v共享内存也是随内核持续的,也就是说当最后一个访问内 ...
- linux网络编程之system v信号量(二)
今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...
- Linux进程通信之System V消息队列
System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...
- linux c编程:System V消息队列一
消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...
- Linux IPC实践(6) --System V消息队列(3)
消息队列综合案例 消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息 server进程发送时, 将mtype指定为接收到的client进程的pid ...
- Linux IPC实践(5) --System V消息队列(2)
消息发送/接收API msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由ms ...
- Linux IPC实践(4) --System V消息队列(1)
消息队列概述 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(仅局限于本机); 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值. 消息队列也有管道一样的不足: ...
随机推荐
- 01点睛Spring MVC 4.1-搭建环境
转发:https://www.iteye.com/blog/wiselyman-2213906 1.1 简单示例 通篇使用java config @Controller声明bean是一个控制器 @Re ...
- [转帖]MyCat教程【简单介绍】
MyCat教程[简单介绍] 2019-10-15 10:27:23 波波烤鸭 阅读数 618 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...
- Mybatis笔记1
Mybatis 持久层框架,数据访问层 mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动,创建连接,创建sta ...
- (1)Spirng Boot 入门(笔记)
文章目录 简介 优点 Hello World 打包成可执行 jar 细节探究 主程序类,主入口类上面的注解 自动生成的项目结构分析 简介 Spring Boot 帮助我们简化 Spring 应用开发: ...
- 【Docker】:全面认识Docker和基本指令
Docker逐渐成为虚拟化技术的佼佼者,接下来会推出一系列的Docker相关技术文章,Docker技术也是架构师的必备技能. 什么是Docker Docker 是一个开源的应用容器引擎,基于Go语言, ...
- xsy 2018 【NOIP2013】货车运输
[NOIP2013]货车运输 Description A 国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆车在不超 ...
- Django出错Xadmin后台报list index out of range
input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('/>&l ...
- C语言下进制的使用
进制规则 十进制 以正常数字1-9开头,如123 八进制 以数字0开头,如0123 十六进制 以0x开头,如0X123 二进制 C语言不能直接书写二进制数 案例如下 int main() { int ...
- 基于thymeleaf实现简单登录
1.引入thymeleaf.静态资源等依赖 <dependency> <groupId>org.springframework.boot</groupId> < ...
- Windows服务器修改远程桌面默认端口
一.打开注册表(通过开始菜单处输入命令输入 regedit回车即可打开注册表信息,或者Win键+R键打开输入框后输入regedit后回车) 二.打开注册表后,在左侧属性菜单进入下列路径“HKEY_LO ...