Linux 进程间通信——消息队列
一、消息队列的原理
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立接收含有不同类型值得数据库。
消息实际上是一个数据块,这个数据块是一个结构体,结构体由自己命名。消息的第一个成员是固定的,它是一个长整型,它代表消息的类型,后面的成员是自己定义的数据。一开始消息队列是空的,可以由一个进程a向消息队列中发送消息,但是如果由另外一个进程b或c去接收消息队列中的消息就会发生阻塞。当一个进程往消息队列中发送消息时,只要这个消息队列没有满,就可以添加进去,如果消息队列满了,就会发生阻塞。当一个进程去接收消息队列中的消息时可以指定消息的类型,当消息队列中没有所指定的消息的类型,进程就会发生阻塞。
1.消息队列与有名管道
消息队列和有名管道有许多相似之处
相同点:
使用消息队列并没有解决我们在使用有名管道时遇到的一些问题,比如管道满时的阻塞问题,在消息队列中同样存在,消息队列满时也会发生阻塞。
不同点:
消息队列相比较管道来说,消息队列少了在打开和关闭管道方面的复杂性。消息队列提供了一种在两个不相关的进程之间传递数据的相当简单且有效的方法。与有名管道相比,消息队列独立于发送和接收进程而存在,这消除了在同步有名管道的打开和关闭时会产生的一些困难。
2.消息队列得优缺点:
(1)优点:
①可以通过发送消息来几乎完全避免有名管道得同步和阻塞问题。
②可以用一些方法来提前查看紧急消息。
缺点:
与管道一样,每个数据块都有一个最大长度得限制,系统中所有队列所包含得全部数据块得总长度也有一个上限。Linux系统有两个宏定义MSGMAX和MSGMNB,它们以字节为单位分别定义了一条消息的最大长度和一个队列的最大长度。其它系统中这些宏定义可能会不一样或者不存在。
3.消息队列的生命周期
消息队列的生命周期并不随进程的结束而结束,是随内核持续的。调用消息队列相关的内核的接口,内核帮忙创建,只要自己不主动去删除,就会一直存在,即便进程已经结束,它们也一直会在内核中被维护着。想用的时候还可以继续用,在程序最后不使用的情况下把它删除。删除的方法有3种,关机、调用相关函数删除和在命令行手动删除。
信号量、共享内存的生命周期也是如此。
二、消息队列相关接口函数
1.msgget() 创建消息队列
创建或者获取一个消息队列的ID
int msgget(key_t key, int msqflg);
参数解释:
key:“房间密码”
msqflg:创建消息队列的方式,同时设置权限
返回值:成功返回消息队列id,失败返回 -1
权限的设置规则:
IPC_CREAT
:可以单独使用,如果消息队列不存在,则重新开辟,函数返回值是新开辟的消息队列的ID;如果已经存在,则沿用已有的消息队列,函数返回值是已有的消息队列的ID。
IPC_EXCL
:无法单独使用,要配合IPC_CREAT使用,即 IPC_CREAT | IPC_EXCL
,表示如果消息队列不存在,则重新开辟,函数返回值是新开辟的消息队列ID;如果已经存在,则报错。
IPC_CREAT | IPC_EXCL | 0664
:开辟消息队列的同时,设置消息队列的访问权限
2.msgsnd() 向消息队列中添加一条消息
该函数的作用是向消息队列中添加一条消息。
int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg);
参数解释:
msgid:消息队列ID,即msgget函数的返回值
msgp: 消息缓冲区的地址,也就是你要向消息队列中添加的消息,需要满足一定的格式。消息格式如下:
struct msgbuf
{ long mtype; // 消息类型, 必须大于0 char mtext[1]; // 消息数据 //(结构体的最后一个成员是数组,该数组也被称为柔性数组,即数组大小可变)
};
msgsz:指定mtext中有效数据的长度。这里的消息长度指的是上面这个结构体中buf成员所占字节数。
msgflag:表示发送消息的方式。一般设置为0。也可以设置IPC_NOWAIT。可选值及其含义如下:
返回值:成功返回0,失败返回-1
3.msgrcv())接收一条消息
该函数的作用是从消息队列的队头取出一条消息。
ssize_t msgrcv(int msqid, void *msgp, size_t msqsz, long msqtyp, int msqflg);
参数解释:
msgid:消息队列id
msgp:输出型参数,表示消息缓冲区的地址。也就是你要把取出来的消息放在哪,同样需要使用指定格式。数据格式和msgsnd函数所要添加的消息的格式一样,如下:
struct msgbuf
{ long mtype; // 消息类型, 必须大于0 char mtext[1]; // 消息数据 //(结构体的最后一个成员是数组,该数组也被称为柔性数组,即数组大小可变)
};
size:用于存放接收到的消息数据的缓冲区大小。
msgtype:选择想要取出的消息类型(虽然叫做消息队列,但是不一定就是取出队头元素,也可以是取出具有相同消息类型中的第一个消息)。主要分为以下三种情况:
msgtype < 0的具体解释:假设消息队列里的消息类型有 1、3、4、5 四种类型的消息,如果msgtype = -4,绝对值是4,那就需要取出消息类型小于等于4的所有消息,因此,取出消息的消息类型必须是1、3、4类型。
msgflag:表示接收消息的方式。一般设置为0,也可以设置IPC_NOWAIT等,可选值如下:
返回值: msgrcv()成功返回mtext中接收到的消息数据的长度, 失败返回-1。
4.msgctl()一般用来销毁消息队列
该函数的作用是控制消息队列,一般用来销毁消息队列。
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
参数解释:
msgid:消息队列id
cmd:对消息队列执行的具体操作,如拷贝、查询、销毁等。可选值如下:
buf:消息队列缓冲区。比如 cmd 为IPC_STAT时,会把消息队列的相关信息拷贝到该缓冲区中。
返回值:msgctl()成功返回0,失败返回-1
相关文章:

Linux 进程间通信——消息队列
一、消息队列的原理 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立接收含有不同类型值得数据库。 消息实际上是一个数据块,这个数据块是一个结构体,结构体由自己命名。消…...

ChatGPT在智能娱乐和游戏互动中的应用如何?
在智能娱乐和游戏互动领域,ChatGPT具有广泛的应用潜力,可以为用户带来更丰富、个性化和有趣的体验。从虚拟角色和游戏情节到实时互动和玩家支持,ChatGPT可以在多个方面为游戏产业带来创新和改变。 **1. **虚拟角色和NPC互动**:Ch…...

【Ubuntu】systemd 及其工具
什么是 systemd systemd 是一个用于管理 Linux 系统启动过程和系统服务的初始化系统。它是现代 Linux 发行版中广泛采用的初始化系统,负责启动和管理操作系统的各个组件。 systemd 的设计目标是提高系统启动速度、优化资源管理和提供更强大的服务管理功能。它引入…...

抖音seo矩阵系统源代码开发部署分享
一、 开发步骤分享 抖音SEO矩阵系统源代码开发部署分享,需要经验丰富的开发人员和服务器管理人员,以下是大致的步骤: 确定你需要的功能和设计,确定开发人员和设计师的角色和任务分配,以及开发进度和计划。 确定服务器…...
FastJson在Java后端方面解析使用(二)
JSON现在常用来做前后端数据交互,两个蝴蝶飞只是简单的对JSON做一下讲解和简单使用。关于JSON,我还了解的远远不够。由于本人经验有限,嘴皮子不溜,所以学术性,概念性,底层性的知识点暂时不做介绍。文章中有错误之处…...

PyTorch深度学习实战(5)——计算机视觉基础
PyTorch深度学习实战(5)——计算机视觉基础 0. 前言1. 图像表示2. 将图像转换为结构化数组2.1 灰度图像表示2.2 彩色图像表示3 利用神经网络进行图像分析的优势小结系列链接0. 前言 计算机视觉是指通过计算机系统对图像和视频进行处理和分析,利用计算机算法和方法,使计算机…...

ImageReader保存图片转 opencvmat
目录 ImageReader 直接保存图片,没成功,格式是yuv420,需要转换 转opencv nv21保存图片,测试ok rgb888 data保存图片: ImageReader 直接保存图片,没成功,格式是yuv420,需要转换 …...

【vue3+ts项目】配置husky+配置commitlint
上一篇文章中配置了eslint校验代码工具 【vue3ts项目】配置eslint校验代码工具,eslintprettierstylelint 1、配置husky 每次手动执行命令才能格式化代码,如果有人没有格式化就提交到远程仓库,这个规范就起不到作用了,所有需要强…...

html实现iframe全屏
前言 html浏览器全屏操作,基于jquery iframe全屏、指定标签全屏 实现 css /** 全屏*/ .lay-dbclick-box{position: relative;width: 100%;height: 100%; } .lay-dbclick-screen{position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 999999999…...

【es6】中的Generator
Generator 一、Generator 是什么?1.1 与普通函数写法不一样,有两个不同 二、Generator 使用2.1 书写方法 三、yield语句3.1 yield和return3.2 注意事项3.3 yield*语句3.4 yield*应用 四、next方法4.1参数4.2 运行逻辑 五、异步解决方案六、Generator相关…...

桥梁安全监测方法和内容是什么?
桥梁安全监测方法和内容是什么?桥梁监测是保障桥梁安全和稳定的重要手段。随着科技的进步,桥梁监测技术和设备不断完善,监测内容也越来越全面。本文万宾科技小编将为大家介绍桥梁安全监测的方法和内容,以期帮助大家更好地了解这一领域。 桥梁…...

prometheus部署及钉钉告警集成Grafana
1、准备工作 安装包 📎alertmanager-0.23.0.linux-amd64.tar.gz 📎node_exporter-1.3.1.linux-amd64.tar.gz 📎prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz 服务端口 Prometheus 9090 node_exporter 9100 alertmanager …...

Java百度提前批面试题
今天分享百度提前批的 Java 后端开发面经,整体上考察的点挺多的,主要重点考察了网络i/o、网络协议、linux系统、mysql,Java 问的不多,可能是百度的后端开发的语言不是主要以 Java 为主,所以重点看面试者的计算机基础是…...

Go语言中的Oop面向对象
Go In OOp 一、 Go是面向对象的吗?二、Structs Instead of Classes 结构体 - OOP in Go三、 Composition Instead of Inheritance 组合嵌套 - OOP in Go1.Composition by embedding structs2. Embedding slice of structs 四、Polymorphism 多态 - OOP in Go1. Polymorphism u…...

Duplicate keys detected: ‘1‘. This may cause an update error.
报错 Duplicate keys detected: ‘1’. This may cause an update error. 注释: 检测到重复密钥:‘1’。这可能会导致更新错误。 解决 首先判断是因为for循环导致的,检查是否出现重复。 笔者是同一个页面两处for循环导致...

C++(8.21)c++初步
1.斐波那契: #include <iostream> #include<iomanip>using namespace std;int main() {cout << "Hello World!" << endl;int a[10];for(int i0;i<10;i){if(0i||1i){a[i]1;}elsea[i]a[i-1]a[i-2];cout <<setw(4) <&l…...

【【Verilog典型电路设计之log函数的Verilog HDL设计】】
Verilog典型电路设计之log函数的Verilog HDL设计 log函数是一种典型的单目计算函数,与其相应的还有指数函数、三角函数等。对于单目计算函数的硬件加速器设计一般两种简单方法:一种是查找表的方式;一种是使用泰勒级数展开成多项式进行近似计算。这两种方式在设计方…...

数字放大(C++)
系列文章目录 1.进阶的卡沙_睡觉觉觉得的博客-CSDN博客 2. 数1的个数_睡觉觉觉得的博客-CSDN博客 3. 双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客 4. 足球联赛积分_睡觉觉觉得的博客-CSDN博客 5. 大减价(一级)_睡觉觉觉得的博客-CSDN博客 6. 小写字母的判断_睡觉觉觉得…...

FOC控制框架图
pmsm电机数学模型以及FOC控制框图(开源小项目FOC控制BLDC电机)_foc 框图_栋哥爱做饭的博客-CSDN博客 电机控制----FOC框架讲解_foc电机控制_修才生的博客-CSDN博客...

Spring工具类(获取bean,发布事件)
spring-beans-5.3.1.jar Component public final class SpringUtils implements BeanFactoryPostProcessor{/*** Spring应用上下文环境*/private static ConfigurableListableBeanFactory beanFactory;//初始化成员变量Overridepublic void postProcessBeanFactory(Configurab…...

腾讯云和阿里云服务器折扣对比_看看哪家划算?
阿里云服务器和腾讯云服务器根据购买时长可以享受一定的优惠折扣,综合对比下来腾讯云折扣更低,阿腾云来对比下阿里云和腾讯云的云服务器根据购买时长可以享受的常规折扣对比: 目录 阿里云和腾讯云折扣对比 阿里云服务器常规折扣 腾讯云服…...

GO语言中的Defer与Error异常报错详细教程
目录标题 一、Defer1. Example2. Deferred methods 延迟方法3. Arguments evaluation 延迟参数4. Stack of defers 延迟程序堆栈5. Practical use of defer 实际使用 二、Error1. Example2. PathError3. DNSError4. Direct Comparison 直接比较5. Do not ignore errors 不要忽略…...

AP6315 DC单节锂电池充电IC 同步2A锂电芯片
概述 是一款面向5V交流适配器的2A锂离子电池充电器。它是采用1.5MHz固定频率的同步降压型转换器,因此具有高达90%以上的充电效率,自身发热量极小。包括完整的充电终止电路、自动再充电和一个达1%的4.2V预设充电电压,内部集成了防反灌保护、输…...

PDF校对工具正式上线,为用户提供卓越的文档校对解决方案
为满足当下对数字化文档校对的精准需求,我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试,该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性: 1.全面性校对:工具支持…...

WSL 配置 Oracle 19c 客户端
Windows WSL 登陆后显示如下: Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantageSystem information as…...

ChatGPT⼊门到精通(1):ChatGPT 是什么
⼀、直观感受 1、公司 OpenAI(美国) 2、官⽅⽹站 3、登录ChatGPT 
idea启动正常,打成jar包时,启动报错
背景 自己写了个小程序,在idea中启动正常,达成jar包发布时,启动报错。 Caused by: java.sql.SQLException: unknown jdbc driver : at com.alibaba.druid.util.JdbcUtils.getDriverClassName(JdbcUtils.java:517) at com.alibaba.druid.pool…...

软考高级系统架构设计师系列论文八十九:论软件需求分析方法和工具的选用
软考高级系统架构设计师系列论文八十九:论软件需求分析方法和工具的选用 一、软件需求相关知识点二、摘要三、正文四、总结一、软件需求相关知识点 软考高级系统架构设计师:论软件需求管理...

java八股文面试[JVM]——类加载器
一、类加载器的概念 类加载器是Java虚拟机用于加载类文件的一种机制。在Java中,每个类都由类加载器加载,并在运行时被创建为一个Class对象。类加载器负责从文件系统、网络或其他来源中加载类的字节码,并将其转换为可执行的Java对象。类加载器…...

CSS中如何实现元素之间的间距(Margin)合并效果?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 外边距合并的示例:⭐ 如何控制外边距合并:⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅ÿ…...