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…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...
解密鸿蒙系统的隐私护城河:从权限动态管控到生物数据加密的全链路防护
摘要 本文以健康管理应用为例,展示鸿蒙系统如何通过细粒度权限控制、动态权限授予、数据隔离和加密存储四大核心机制,实现复杂场景下的用户隐私保护。我们将通过完整的权限请求流程和敏感数据处理代码,演示鸿蒙系统如何平衡功能需求与隐私安…...
