Linux进程通信——消息队列
概念
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
特点
1.消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。(消息队列是结构体)
2.消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
3.消息队列可以实现消息的随机查询,消息不一定要以先进先出的次席读取,也可以按消息的类型读取。

两者的队列ID需相同才能成功实现存放数据和取数据,如图都指向队列1的最后一个。
消息队列与管道的不同点:写入读取后内容还存在于Linux内核中,不会跟管道一样读取完就消失。
创建
从消息队列特点可知,两个进程分别需要同队列ID相同的队列进行写入数据并读取数据,此时要想成功创建一个消息队列,需关心两个问题:
问题一:进程B如何添加消息到队列
问题二:进程A如何读取队列的消息
头文件
#include <sys/msg.h>
常用API
msgget()
创建或打开消息队列:成功返回队列ID,失败返回-1
int msgget(key_t key, int flag);
| key | 是一个索引值,为非负数,将通过索引值在Linux内核找到队列 |
| flag | 打开队列的方式 |
在以下两种情况下,msgget将创建一个新的消息队列:
1、如果没有与键值key相对应的消息队列,并且flag中包含了IPC_CREAT标志位。
msgget(key,IPC_CREAT);
2、key参数为IPC_PRIVATE。
msgget(key,IPC_PRIVATE);
msgsnd()
添加消息:成功返回0,失败返回-1
int msgsnd(int msqid, const void *ptr, size_t size, int flag);
msqid:消息队列的ID
ptr:写入的数据,指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下:
struct msgbuf
{long mtype; //消息类型,必须大于0char mtext[1];//消息文本
};
size:数据的长度
flag:0,表示忽略,表示进程将被阻塞直到函数可以从队列中得到符合条件的消息为止;(还有许多,此处省略)
msgrcv()
读取消息:成功返回消息数据的长度,失败返回-1
int msgrcv(int msqid, void *ptr, size_t size, long type,int flag);
msqid:消息队列的ID
ptr:写入的数据,指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下:
struct msgbuf
{long mtype; //消息类型,必须大于0char mtext[1];//消息文本
};
type:消息类型
| type = 0 | 返回队列中的第一个消息 |
| type >0 | 返回队列中消息类型为 type 的第一个消息 |
| type< 0 | 返回队列中消息类型值小于或等于 type 绝对值的消息,如果有多个,则取类型值最小的消息 |
可以看出,type值非 0 时用于以非先进先出次序读消息。也可以把 type 看做优先级的权值。
size:数据的长度
flag:0,表示忽略,表示进程将被阻塞直到函数可以从队列中得到符合条件的消息为止;(还有许多,此处省略)
代码展示
get.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>struct msgbuf
{long mtype;char mtext[128];
};int main()
{int msgId;//创建消息队列IDstruct msgbuf readBuf;//定义一个读取数据的结构体msgId = msgget(1234,IPC_CREAT|0777);//在内核中打开或建立键值为1234的,权限为0777的消息队列if(msgId == -1)//如果创建失败则执行下面代码{printf("create queue failed\n");}msgrcv(msgId,&readBuf,sizeof(readBuf.mtext),888,0);//从队列中获取888类型的数据并存放到结构体的mtext中,如果队列中未出现888类型的数据,则程序阻塞在这里,这里的888需要与写入队列类型数据一致printf("read from queue:%s\n",readBuf.mtext);struct msgbuf sendBuf = {999,"thank you for reach\n"};//读取完毕后将字符串内容写入到999类型的数据中,这里的999类型需要与读取的类型数据一致msgsnd(msgId,&sendBuf,strlen(sendBuf.mtext),0);//将上一行的结构体数据写入1234消息队列中return 0;
}
send.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>struct msgbuf
{long mtype;char mtext[128];
};int main()
{int msgId;struct msgbuf sendBuf = {888,"this is message from queue\n"};//将字符串内容写入到888类型的数据中,这里的888类型需要与读取的类型数据一致struct msgbuf readBuf;msgId = msgget(1234,IPC_CREAT|0777);if(msgId == -1){printf("create queue failed\n");}msgsnd(msgId,&sendBuf,strlen(sendBuf.mtext),0);//将结构体内容写入到1234消息队列中msgrcv(msgId,&readBuf,sizeof(readBuf.mtext),999,0);//写入之后从队列中获取999类型的数据并存放到结构体的mtext中,如果队列中未出现999类型的数据,则程序阻塞在这里,这里的999需要与写入队列类型数据一致printf("return form queue:%s\n",readBuf.mtext);return 0;
}
运行get.c,创建并打开键值为1234的消息队列,但此时表现为堵塞状态,因为队列里没有888类型的数据

运行send.c,创建并打开键值为1234的消息队列,往队列里写入888类型的数据,此时接收端会接受到写入端写入消息队列的数据并将其读取,同时让接收端往队列里写入999类型的数据,让写入段接受999类型的数据并读取

相关文章:
Linux进程通信——消息队列
概念 消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。 特点 1.消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。(消息队列是结构体) 2.消息队列独立于发送与接…...
ArcGIS教程——ArcGIS工具-按线分割面
功能说明 在ArcGIS数据处理过程中,有时需要沿线把面要素分割开,可以使用高级编辑中的分割面(Cut Polygon)工具。那么,如果要用线图层分割面图层该怎么办呢?地理遥感生态网平台开发了一个自定义模型工具。它…...
C语言进阶之冒泡排序
✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,一起学习C语言🎈 目录 前情回顾 1、回调函数 2、冒泡排序 3、库函数qsort cmp(sqort中的比较函数,需要我们自定义) …...
零代码编程:用ChatGPT将SRT字幕文件批量转为Word文本文档
一个文件夹中有多个srt视频字幕文件,srt文件里面有很多时间轴: 现在想将其批量转为word文档,去掉里面与字符无关的时间轴,在ChatGPT中输入提示词: 你是一个Python编程专家,要完成一个批量将SRT字幕文件转为…...
力扣刷题第二十六天--二叉树
前言 昨天看总决赛,差距太大,看的没意思,真的是一点变通没有啊。难受,没有写题的状态了。大概率是最后一次看比赛了,青春已复过,白日忽相催。召唤师要和生活对线了。英雄们的语音,台词…...
电脑显示msvcp140_1.dll丢失的5个常用解决方法,亲测可修复
常见于计算机操作中的"msvcp140_1.dll丢失"错误警示,往往令部分应用程序无法正常启动。为了解决这个问题,我们需要采取一些措施来修复丢失的文件。本文将介绍6个解决msvcp140_1.dll丢失的方法,帮助大家快速恢复计算机的正常运行。 …...
hive sql 行列转换 开窗函数 炸裂函数
hive sql 行列转换 开窗函数 炸裂函数 准备原始数据集 学生表 student.csv 讲师表 teacher.csv 课程表 course.csv 分数表 score.csv 员工表 emp.csv 雇员表 employee.csv 电影表 movie.txt 学生表 student.csv 001,彭于晏,1995-05-16,男 002,胡歌,1994-03-20,男 003,周杰伦,…...
Continuity” of stochastic integral wrt Brownian motion
See https://imathworks.com/math/math-continuity-of-stochastic-integral-wrt-brownian-motion/...
设置 wsl 桥接模式
一、环境要求 Win10/Win11 专业版,并已安装 Hyper-V 二、具体步骤 打开 Hyper-V 管理器 创建虚拟交换机 WSL Bridge 修改wsl配置文件 .wslconfig .wslconfig 文件所在路径如下: C:\Users\<UserName>\.wslconfig若 .wslconfig 文件不存在&am…...
[uni-app] uni.showToast 一闪而过问题/设定时间无效/1秒即逝
toast一闪就消失 1.猜测频繁点击导致 – 排除 2.猜测再定时器内导致-- 排除 3.和封装的接口调用一起导致 - 是改原因 深挖发现: axios封装中, 对loading/hindloading进行了配置, 看来是 showToast 与 loading等冲突导致的 wx.hideLoading(Object object) 解决办法 再封装的…...
7、信息打点——资产泄露CMS识别Git监控SVNDS_Store备份
知识点: CMS指纹识别、源码获取方式习惯&配置&特征等获取方式托管资产平台资源搜索监控 如何获取源码 直接识别CMS,根据CMS获取网站源码。CMS直接识别工具:云悉指纹识别平台。识别不了CMS,则通过以下方式获取源码&…...
【运维篇】5.6 Redis server 主从复制配置
文章目录 0. 前言1. 配置方式步骤1: 准备硬件和网络步骤2: 安装Redis步骤3: 配置主服务器的Redis步骤4: 配置从服务器的Redis步骤5: 测试复制功能步骤6: 监控复制状态 2. 参考文档 0. 前言 在Redis运维篇的第5.6章节中,将讨论Redis服务器的主从复制配置。在开始之前…...
Hive语法,函数--学习笔记
1,排序处理 1.1cluster by排序 ,在Hive中使用order by排序时是全表扫描,且仅使用一个Reduce完成。 在海量数据待排序查询处理时,可以采用【先分桶再排序】的策略提升效率。此时, 就可以使用cluster by语法。 cluster…...
LeetCode热题100——动态规划
动态规划 1. 爬楼梯2. 杨辉三角3. 打家劫舍 1. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? // 题解:每次都有两种选择,1或者2 int climbStairs(int n) {if (n …...
初识树(c语言)
树 定义:树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。 有一个特殊的结点,称为根结点,根节点没有前驱结点 除根节点外,其余结点被分成M(M>0)个互不相交…...
听GPT 讲Rust源代码--src/librustdoc(2)
题图来自 Chromium项目将支持Rust编程语言[1] File: rust/src/librustdoc/html/render/search_index.rs 在Rust源代码中,rust/src/librustdoc/html/render/search_index.rs文件的作用是生成搜索索引,用于在Rust文档页面上进行关键字搜索。该文件实现了一…...
多目标应用:基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度(MATLAB)
一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、基于非支配排序的蜣螂优化算法NSDBO 基于非支配排序的蜣螂优化算法NSDBO简介: https://blog.csdn.net/weixin46204734/article/details/128…...
泉盛UV-K5/K6全功能中文固件
https://github.com/wu58430/uv-k5-firmware-chinese/releases 主要功能: 中文菜单 许多来自 OneOfEleven 的模块: AM 修复,显著提高接收质量长按按钮执行 F 操作的功能复制快速扫描菜单中的频道名称编辑频道名称 频率显示选项扫描列表分配…...
基于JPBC的无证书聚合签名方案实现
基于JPBC的无证书聚合签名方案实现 摘要 一开始签名方案是基于PKI的,无证书签名起源于 基于身份密码体制, 2009 年第一篇无证书签名方案1被提出,随后出现了一些列方案2,3;包括无配对的无证书聚合签名方案4,更多内容参考文献5. 暂时没有看见…...
FreeRTOS内存管理分析
目录 heap_1.c内存管理算法 heap_2.c内存管理算法 heap_3.c内存管理算法 heap_4.c内存管理算法 heap_5.c内存管理算法 内存管理对应用程序和操作系统来说非常重要,而内存对于嵌入式系统来说是寸土寸金的资源,FreeRTOS操作系统将内核与内存管理分开实…...
清华AlignBench:首个中文大模型对齐评测基准深度解析与实战指南
1. 项目概述:为什么我们需要一个中文对齐评测基准?如果你最近在关注大语言模型(LLM)的发展,尤其是中文模型,可能会发现一个现象:各家厂商都在宣传自己的模型“能力强大”、“理解深刻”、“逻辑…...
ART-PI开发板实测:解锁STM32H750隐藏的2MB Flash,手把手教你修改Keil MDK链接脚本
ART-PI开发板深度实战:解锁STM32H750隐藏Flash的完整工程指南 当ART-PI开发板遇上内存焦虑,开发者们往往在128KB的官方Flash限制下绞尽脑汁。但鲜为人知的是,STM32H750XBH6这颗芯片体内还沉睡着近16倍的存储潜力。本文将带你深入芯片内存架构…...
什么是数据接口
数据接口的概念与定义数据接口是不同系统、应用程序或组件之间进行数据交换的标准化通道。它定义了数据如何被请求、传输和解析,确保不同平台能够无缝协作。常见的数据接口类型包括API(应用程序编程接口)、Web Service、数据库连接接口等。数…...
从启德机场降落看约束优化:工程师视角下的极限系统设计
1. 一次难忘的降落:亲历启德机场的惊心动魄作为一名常年与电路板、代码和逻辑门打交道的工程师,我的职业生涯里充满了各种“硬核”挑战,比如调试一块死活不工作的FPGA,或者赶在项目节点前完成一个复杂的数字系统设计。但说实话&am…...
神经渲染革命:一文读懂坐标网络的前世今生与未来战场
神经渲染革命:一文读懂坐标网络的前世今生与未来战场 引言 从《曼达洛人》中令人惊叹的虚拟制片,到电商平台上可360旋转的3D商品,再到仅凭几张照片就能“复活”的数字人,这些酷炫技术背后,都离不开一项核心突破——神…...
Acad Radiol(IF=3.9)首都医科大学宣武医院卢洁教授团队:基于MRI的Delta放射组学预测乳腺癌患者新辅助化疗后腋窝淋巴结病理完全缓解
01文献学习今天分享的文献是由首都医科大学宣武医院卢洁教授团队于2025年1月在《Academic Radiology》(中科院2区,IF3.9)上发表的研究“Delta Radiomics Based on MRI for Predicting Axillary Lymph Node Pathologic Complete Response Afte…...
AISMM评估到底值不值?SITS2026主讲人亲授:92%企业漏掉的3项隐性ROI测算方法
更多请点击: https://intelliparadigm.com 第一章:AISMM评估的价值再定义 从合规驱动到能力演进 传统安全成熟度模型常被简化为审计检查清单,而AISMM(AI Security Maturity Model)将评估视角转向组织在AI全生命周期中…...
李辉《曾国藩日记》笔记:人人都狭隘,只是程度不一样!
李辉《曾国藩日记》笔记:人人都狭隘,只是程度不一样!原文:同治元年九月十八日早饭后清理文件。旋见客,立见者十余次,坐见者两次。写沅弟信一件、左季高信一件。午刻万篪轩来久坐。中饭后阅本日文件。至幕府…...
从IDF 2012看英特尔技术十字路口:Haswell能效革命与Atom移动困局
1. 从IDF 2012看英特尔的技术十字路口:Haswell的辉煌与Atom的迷雾 2012年9月的旧金山,空气中弥漫着一股熟悉的、属于硅谷的躁动。英特尔开发者论坛(IDF)即将拉开帷幕,而就在同周,苹果也计划发布新品。对于当…...
梳理一下前端模块化规范:CommonJS ESM AMD CMD UMD
前端模块化规范在发展过程中出现过多种规范,大多开发者都对这些名词有个印象,但问起来又有些模糊。本文的目的是做一个梳理,帮助记忆。先上一张对比表:类型核心定位语法关键词适用环境特点CommonJS(CJS)Nod…...
