进程间通信-----消息队列

进程间通信之消息队列 首先说一下什么是消息队列。消息队列是进程间通信的一种,它是由操作系统维护的以字节序列为基本单位的间接通信机制,它提供了一个进程向另一个进程发送一个带类型的数据块的方法。 我们知道用管道来实现进程间通信的机制是两个进程利用管道文件来实现数据交流,那么消息队列与管道有什么区别呢? 首先看一下管道通信机制的模型: 然后消息队列通信模型: 从上面图中可看出两者有着本质的区别。那么两个进程怎... 阅读详情

原理:
用户组织一个 带有类型的数据块,添加到消息队列中,其他进程从该消息队列中取出对应类型的数据块

本质: 操作系统在内核为用户创建并且维护的一个队列
并且该队列为用户提供了一个两个进程之间发送具有类型的数据块的方法

不足:
数据块的长度有上限(MSGMAX)
消息队列总字节数有上限(MSGMNB)
消息队列个数有上限(MSGMNI)

创建消息队列:
int msgget(key_t key, int msgflag);
key:消息队列的标识符(名字)
msgflag:权限标志位,一般为(IPC_CREAT | 0666(访问权限))
IPC_CREAT:如果该消息队列不存在,则创建
IPC_EXCL:如果该消息队列存在,则创建失败
IPC_NOWAIT:若阻塞,则报错返回
创建成功:返回该消息队列的操作句柄(标识码)(不是文件描述符)
创建失败:返回-1

创建成功之后
操作系统为用户维护一个消息队列结构体(msqid_ds)
msqid_ds中有一个 ipc对象(ipc_perm),当中有key值(身份标识),并且仍然由操作系统维护

注:ipc_perm结构体对象是 消息队列、共享内存以及信号量都具有的一个数据结构

查看消息队列
命令:ipcs -q
在这里插入图片描述

数据块结构体:
struct msgbuf{
long mtype;
char mtext[1];
};
mtype:数据块的类型
mtext:数据块的内容
注:数据块大小必须小于系统规定的上限值

消息队列结构体(msqid_ds)图示分析:
在这里插入图片描述

发送数据块(即:将一个数据块放入到消息队列中)
int msgsnd(int msgid, const void msgp, size_t msgsz, int msgflg);*
msgid:该消息队列的标识码
msgp:将要放入消息队列的数据块
msgsz:数据块长度(不包含保存数据块类型的长整型)
msgflg:控制消息队列将要发生的事情,默认0
成功返回0,失败返回-1.

接收数据块(即:从消息队列中拿出对应类型的数据块)
ssize_t msgrcv(int msgid, void msgp, size_t msgsz, long msgtype, int msgflg);*
msgid:消息队列标识码
msgp:接收消息队列中的数据块指针(输出型参数)
msgsz:数据块长度(不包含保存数据块类型的长整型)
msgtyp:将要接收的数据块的类型,即:msgbuf.mtype的内容
msgflg:控制消息队列将要发生的事情,默认0
成功返回数据块长度,失败返回-1

删除消息队列
1.命令删除:
ipcs -q 查看
ipcrm -q + id 按 id 号移除消息队列
ipcrm -Q + key <键> 按键值移除消息队列
2.函数删除:
int msgctl(int msgid, int cmd, struct msgid_ds buf);
msgid:消息队列标识码
cmd:将要执行的操作
IPC_STAT:get ipc_perm options
IPC_SET:set ipc_perm options
IPC_RMID:删除
buf:获取
消息队列信息*(即:得到该消息队列的msgid_ds结构体信息)、不需要获取则置NULL

注:使用完消息队列资源之后必须删除,内核不会清理,其生命周期随内核!!

关于进程间通信—管道的内容,大家可以参考一下:https://blog.youkuaiyun.com/Code_ZX/article/details/84986104

谢谢大家的支持!!
在这里插入图片描述

C++进程间通信 消息队列 C++进程间通信 消息队列 阅读详情

相关推荐

思科9117AP从零配置EWC模式实战:Wi-Fi6网络搭建避坑指南

本文详细介绍了思科9117AP在Wi-Fi6网络环境下配置EWC模式的实战指南,涵盖镜像准备、网络环境配置、模式转换步骤及高级运维技巧。通过EWC模式,企业可实现控制器与AP的一体化部署,显著降低成本和简化运维,特别适合中小企业Wi-Fi6网络搭建。

weixin_28318011的博客 333

APUE编程:127---进程间通信(消息队列:struct  msqid_ds)

一、消息队列简介 消息队列是消息的链接表,存储在内核中,由消息队列标识符标识 二、消息队列的系统限制 “导出的”:表示这种限制来源于其他限制(例如:在Linux中,最大消息数是根据最大队列数和队列中所允许的最大数据量决定的) 最大队列数:还要根据系统上安装的RAM的数量决定 队列的最大字节数限制:进一步限制了队列中将要存储的消息的最大长度 三、struct msqid_ds结构...

董哥的黑板报 2747

IFRS 9与CECL对比解析:跨国企业财务必须掌握的两种信用损失模型

本文深度解析IFRS 9与CECL两种信用损失模型的差异,帮助跨国企业应对财务合规挑战。从基础架构、数据治理到监管策略,详细对比三阶段模型与单一阶段模型的核心区别,并提供实施双轨制的实务建议,助力企业优化资本管理和税务筹划。

3c4x5z6v7b的博客 668

linux 消息队列状态:struct msqid_ds

Linux的消息队列(queue)实质上是一个链表, 它有消息队列标识符(queue ID). msgget创建一个新队列或打开一个存在的队列; msgsnd向队列末端添加一条新消息; msgrcv从队列中取消息, 取消息是不一定遵循先进先出的, 也可以按消息的类型字段取消息.  1. 标识符(des)和键(key):     消息队列, 信号量和共享存储段, 都属于内核中的I

labrary的专栏 2444

Kettle 连接 Oracle 数据库全流程指南

例如:C:\Oracle\product\19.0.0\dbhome_1\jdbc\lib\ojdbc8.jar 2. 替换 Kettle 驱动文件 将驱动文件复制到 Kettle 的 目录: 删除旧版本驱动:如 ojdbc14.jar 只能保留一个oracle驱动 重启 Kettle 以加载新驱动 二、配置数据库连接 1. 启动 Kettle 并新建转换 运行 (Windows)或 (Linux)。 新建转换(Transformation),添加 “表输入” 步骤,双击进入配置。 2.

qq_44724453的博客 3482

微信小程序 - {errCode: 10008, errno: 1500104, errMsg: “writeBLECharacteristicValue:fail write characteris

微信小程序errCode: 10008, errno: 1500104, errMsg: "writeBLECharacteristicValue:fail write characteristics error. 10008, errMsg=The value's length is invalid.",uni-app微信小程序报错,uniApp小程序调用蓝牙api报错,向低功耗蓝牙设备的某个特征写入数据时错误,UniApp微信小程序蓝牙API调用报错10008解决方案,蓝牙设备进行通信时,向设备写入数据

🏆 前端领域优质创作者 4431

SystemV 消息队列设置不能msqid_ds 和 msginfo 同时设置。

如下为使用两个结构进行设置 消息队列 struct msqid_ds tmsgbuf; tmsgbuf.msg_qbytes = m_nMsgMaxSize;     struct msginfo tmsginfo; tmsginfo.msgmax = m_nMsgMaxSize; tmsginfo.msgmnb = m_nMsgMaxSize;

madmanlei的专栏 1160

KEPServerEX 6 之 EX 6.11.718.0 发布说明

KEPServerEX 6.11.718.0 发布说明

-雲飛兄-博客 2882

进程间通信——消息队列

进程间通信——消息队列 什么是消息队列?     消息队列就是提供了一个进程向另一个进程发送一个数据块的方法, 其中每一个数据块都被认为有类型。接收者进、程接收的数据块可以有不同的类型值, 通过发送消息来避免命名管道的同步和阻塞问题。 那么消息队列和管道到底有什么不同呢?  消息队列是基于消息的,而管道是基于字节流的;  消息队列的读取不一定是先进先出的;  消息队列是

Gary的面包屑小道 766

qtcreator使用远程服务器编译代码

我并没有找到很好的windows上可以用的rsync工具,最后是装了wsl来调用rsync同步到代码后,在用ssh调用linux命令来编译的。安装wsl安装ubuntu启动wsl然后把windows里的ssh文件证书和配置复制到wsl里同时config的key目录需要改一下,这样就可以登录服务器了然后在home目录创建build.sh进行远程编译。

习惯就好zz的专栏 1381

大津法(OTSU)点云强度信息分割

大津法(OTSU)是一种灰度图像自适应的阈值分割方法,大津法根据图像的灰度分布,将图像分成背景和前景两部分,前景就是需要按照阈值分割出来的部分。由于点云的强度信息的特性,也可以利用此方法进行分类,但需要保证信息干扰较少,例如道路标线分割等场景较为适用。

qq_48694523的博客 965

通达信数据解析实战:从二进制文件到量化分析

通达信作为国内主流的证券分析平台,其高效的二进制数据格式为专业投资者提供了丰富的市场信息。然而,传统的解析方法往往复杂繁琐,让许多开发者望而却步。mootdx库的出现彻底改变了这一现状,让普通用户也能轻松驾驭通达信数据。 ## 项目核心价值解析 **技术优势概览** - 🚀 极速数据读取,支持大规模金融数据处理 - 📊 智能格式识别,自动适配多种市场数据 - 🔧 统一API设计,显著降低

gitblog_01058的博客 629

FineBI学习总结

交叉表:一组作为行标题显示在表的左部,另一组作为列标题显示在表的顶部。连接到数据,如果数据不满足数据分析的需求,先进行自助数据集处理。数据集分类:DB表、SQL、Excel、自助数据集。分组表:将报表中的数据按相同项合并为一组显示。1、数据准备2、制作仪表板3、分享仪表板。左合并:保留左边全部数据,合并右边。右合并:保留右边全部数据,合并左边。上下拼接:上下拼接到一张表数据。3、如何实现拼表:多表拼一张。分组–业务包–数据集–字段。字段分类:数值、文本和日期。目录–仪表板–数据准备。维度:文本和日期类型。

Rsun2018的博客 1561

【Linux】进程间通信——消息队列

如下图所示,对message1.c编译为mess1,执行该程序,发现a1写入的”hello1“被读取输出在屏幕上。message.c:发送消息”hello1",该进程运行一次,就会有1个“hello1"被添加入消息队列中。如下图所示,对message.c编译为mess,执行该文件1次,执行ipcs命令查看发现消息队列被添加一次。通过代码掌握消息队列是如何发送与接收消息。在消息队列中读取消息。

qq_53830608的博客 2144

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

消息队列实现进程间通信

进程间通信 —IPC(InterProcess Communication) 进程间通信是不同的进程通过一个或多个文件来传递信息。经常用到的通信方式有两种,一种是通过管道来实现两个进程间的通信,管道机制是创建的不同进程通过调用管道函数在内核中开辟一块空间来实现。而还有一种方式就是使用system V标准,来实现不同进程间的通信,下来就浅谈一下system V标准中的第一种通信方式——消息队

Atom丶的博客 2313

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

进程间通信-消息队列

进程间通信-消息队列

2401_85565442的博客 1080

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux中进程间通信——消息队列

Linux中进程间通信——消息队列   一、消息队列概念 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。 Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最

MOON5555的博客 439

进程间通信 —— 消息队列

本文主要记录在学习Linux进程间通信时,关于消息队列的原理、实例代码及总结

再努力一点点就好了 3501

【Linux】进程间通信之消息队列

【Linux】进程间通信之消息队列

一点一点变好 2722

进程间通信------消息队列

文章目录前言一、什么是消息队列?二、消息队列使用的函数1. ftok()函数2、msgget函数总结 前言 消息队列是进程间通信的最主要方法之一,相比于其他方法而言,信号队列成功克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。在多进程之间需要协同处理某个任务时能够合理的进行进程间的同步以及数据交流。 以下是本篇文章正文内容,下面案例可供参考 一、什么是消息队列? 消息队列(Message Queue,简称MQ)是由内核管理的消息链接表,由消息队列标识符标识,标识符简称队列ID。消

weixin_48487878的博客 3737
上一篇: 进程间通信----管道
下一篇: 进程间通信------共享内存
Code_zx
博客等级 码龄9年 83粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值