【Linux】进程间通信之消息队列
文章目录
- 消息队列的概念
- 消息队列的出队特点
- 消息队列函数接口
- 获取消息队列
- 向消息队列发送消息
- 接收消息
- 操作消息队列的接口
- 代码演示
- ipcs命令
消息队列的概念
消息队列提供进程间数据块传输的方法,传输的每一个数据块都认为是有类型的,不同的数据块是有优先级的;
系统中可能有很多的msgqueue, 每个MQ用消息队列描述符(消息队列ID: qid) 来区分,qid是唯一 的,用来区分不同的MQ。
消息队列的出队特点
消息队列中的数据都是先进先出的,整个队列中的数据是用链表组织起来的。
消息队列的每一个元素都是有类型的,用类型可以区分不同的消息,可以按照消息类型先进先出,也可以按照原本队列的顺序先进先出
消息队列函数接口
获取消息队列
int msgget(key_t key, int msgflg);
功能:以特定的消息队列标识符创建一个消息队列,并返回消息队列的操作句柄
头文件:sys/types.h、sys/ipc.h、sys/msg.h
参数:
- key:消息队列的标识符
- msgflg:创建的标志,可以按位或上一个权限(8进制的数字):IPC_CREAT:若共享内存不存在,则创建;IPC_EXCL:与IPC_CREAT一同使用,为了确保共享内存已经存在时,会报告错误
返回值: - 成功:返回队列ID
- 失败:返回-1,并设置erron
向消息队列发送消息
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
参数:
- msgid:消息队列ID
- msgp:指向msgbuf的指针,用来指定发送的消息。操作系统为该函数发送的消息定义了发送格式,只是定义了一部分,另一部分要程序员自己去定义
- msgsz:要发送消息的长度,消息内容的长度,这个参数的取值并不是整个struct msgbuf结构体的大小,而是结构中mtext的大小

- msgflg:创建标记;0:阻塞发送;IPC_NOWAIT:非阻塞发送,如果指定IPC_NOWAIT,失败会立即返回
接收消息
ssize_t msgrcv(int msqid, void *msgp, sizet msgsz, long msgtyp, int msgflg)
头文件:sys/types.h、sys/ipc.h、sys/msg.h
参数:
- msqid:消息队列ID
- msgp:指向msgbuf的指针,用来接收消息(出参)
- msgsz:要接收消息的长度
注意:参数msgsz 指定由msgp 参数指向的结构的成员mtext的最大大小(以字节为单位), - msgtyp:接收消息的方式
| msgtyp | 解释 |
|---|---|
| msgtyp = 0 | 读取队列中的第一条消息,就相当于不区分类型,按照插入的顺序,先进先出 |
| msgtyp > 0 | 读取队列中类型为msgtyp 的第一条消息,除非在msgflg中指定了MSG_ EXCEPT, 否则将读取类型不等于msgtyp的第一条消息 |
| msgtyp < 0 | 读取队列中类型小于或等于msgtyp 绝对值的第一条消息 |
- msgflg:创建标记;0:阻塞发送;IPC_NOWAIT:非阻塞发送,如果指定IPC_NOWAIT,失败会立即返回
返回值:
- 成功返回实际读取消息的字节数,,
- 失败返回-1,并设置erron
操作消息队列的接口
int msgctl(int msqid, int cmd, struct msqid_ ds *buf);
参数:
- msqid:消息队列ID
- cmd:控制命令,例如IPC_ RMID:删除命令 IPC STAT:获取状态
- buf:存储消息队列的相关信息的buf
返回值:
- 成功根据不同的cmd有不同的返回值,
- 失败返回-1,并设置erron
从消息队列中拿数据和从共享内存中拿数据不一样,是直接取走数据,不是拷贝走
代码演示
往消息队列中发送消息:
1 #include <stdio.h>2 #include <unistd.h>3 #include <sys/msg.h>4 struct Msgbuf{5 long mtype;6 char mtext[255];7 };8 int main(){9 /*10 * 目的:往消息队列当中发送消息11 *12 * 做法:13 * 1. 创建消息队列14 * 2. 组织要发送的消息,并且发送出去15 * 1 : send msg116 * 2 : send msg217 * 3 : send msg318 * 4 : send msg419 * ...20 * */ 21 int qid = msgget(0x78787878, IPC_CREAT | 0664);22 if(qid < 0){23 perror("msgget");24 return 0;25 }26 27 for(int i = 0; i < 10; i++){28 //i [0, 9]29 struct Msgbuf mb;30 mb.mtype = i;31 snprintf(mb.mtext, sizeof(mb.mtext), "send msg%d", i);32 msgsnd(qid, &mb, sizeof(mb.mtext), 0);33 }34 return 0;35 }
从发送队列中接收消息:
1 #include <stdio.h>2 #include <unistd.h>3 #include <sys/msg.h>4 5 struct Msgbuf{6 long mtype;7 char mtext[255];8 };9 10 int main(){11 /*12 * 目的:从消息队列当中获取消息13 *14 * 做法:15 * 1. 获取或者创建消息队列16 * 2. 调用msgrecv函数进行获取消息17 * 3. 打印获取到的消息内容18 * send msg119 * send msg220 * .... 21 *22 * 4 : send msg423 * */24 int qid = msgget(0x78787878, IPC_CREAT | 0664);25 if(qid < 0){26 perror("msgget");27 return 0; 28 }29 struct Msgbuf mb;30 31 msgrcv(qid, &mb, sizeof(mb.mtext), 5, 0); // send msg532 printf("%s\n", mb.mtext);33 msgrcv(qid, &mb, sizeof(mb.mtext), 6, 0); // send msg634 printf("%s\n", mb.mtext);35 msgrcv(qid, &mb, sizeof(mb.mtext), 7, 0); // send msg736 printf("%s\n", mb.mtext);37 return 0;38 }
执行结果:

ipcs命令
用该命令查看一下:

ipcrm -q [qid] 可删除消息队列
消息队列的生命周期跟随操作系统内核
相关文章:
【Linux】进程间通信之消息队列
文章目录 消息队列的概念消息队列的出队特点消息队列函数接口获取消息队列向消息队列发送消息接收消息操作消息队列的接口 代码演示ipcs命令 消息队列的概念 消息队列提供进程间数据块传输的方法,传输的每一个数据块都认为是有类型的,不同的数据块是有优…...
一次Linux中的木马病毒解决经历(6379端口---newinit.sh)
病毒入侵解决方案 情景 最近几天一直CPU100%,也没有注意看到了以为正常的服务调用,直到腾讯给发了邮件警告说我的服务器正在入侵其他服务器的6379端口,我就是正常的使用不可能去入侵别人的系统的,这是违法的. 排查 既然入侵6379端口,就怀疑是通过我的Redis服务进入的我的系统…...
ProtoBuf
文章目录 1.认识 ProtoBuf2. 安装ProtoBuf3. 快速上手 ProtoBuf4. proto3 语法5. probuf 实战6. 总结 1.认识 ProtoBuf 在认识 啥是 ProtoBuf 之前我们先来 回顾一下 (或 了解 一下 啥是 序列化) 序列化概念回顾 : 图一 : 回顾 序列化 ,下面…...
AJ-Captcha行为验证在vue中的使用
项目场景: 提示:这里简述项目相关背景: 项目场景:由原先的验证码校验升级为行为验证校验 使用方法 提示:参考文档: 参考文档:vue使用AJ-Captcha文档 gitee地址:AJ-Captcha &…...
Layui列表复选框根据条件禁用
// 禁用客服回访id有值的复选框res.data.forEach(function (item, i) {if (item.feedbackEmpId) {let index res.data[i][LAY_TABLE_INDEX];$(".layui-table tr[data-index"index"] input[typecheckbox]").prop(disabled,true);$(".layui-table tr[d…...
K8S核心组件etcd详解(下)
1 k8s如何使用etcd 在k8s中所有对象的manifest都需要保存到某个地方,这样他们的manifest在api server重启和失败的时候才不会丢失。 只有api server能访问etcd,其它组件只能间接访问etcd的好处是 增强乐观锁系统及验证系统的健壮性 方便后续存储的替换…...
【HarmonyOS】【DevEco Studio】ohpm安装失败该如何解决?
【关键词】 HarmonyOS、DevEco Studio、ohpm安装失败 【问题背景及解决方案】 最近遇到很多DevEco Studio安装ohpm失败的问题,下面给大家介绍几种出现的问题以及解决方案: 1、ohpm not set up,报错截图如下: 解决方案&…...
STM32 cubemx CAN
接收用到的结构体如下:CAN概念: 全称Controller Area Network,是一种半双工,异步通讯。 物理层: 闭环:允许总线最长40m,最高速1Mbps,规定总线两端各有一个120Ω电阻,闭环…...
贴片电阻封装尺寸及焊盘尺寸
1、贴片电阻封装尺寸 有英制和公制之分,英制的单位是inch,公制的单位是m;(m、cm、mm只是进制不同) 通常说的都是英制,比如0603指的是inch单位下的0.06inch和0.03inch; 下图有inch和mm的对照、…...
软考笔记——9.软件工程
软件工程的基本原理:用分阶段的生命周期计划严格管理、坚持进行阶段评审、实现严格的产品控制、采用现代程序设计技术、结果应能清除的审查、开发小组的人员应少而精、承认不断改进软件工程事件的必要性。 软件工程的基本要素:方法、工具、过程 软件生…...
uniapp小程序实现上传图片功能,并显示上传进度
效果图: 实现方法: 一、通过uni.chooseMedia(OBJECT)方法,拍摄或从手机相册中选择图片或视频。 官方文档链接: https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia uni.chooseMedia({count: 9,mediaType: [image,video],so…...
基于物理场的动态模式分解(piDMD)研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Docker部署rabbitmq遇到的问题 Stats in management UI are disabled on this node
1. Stats in management UI are disabled on this node #进入rabbitmq容器 docker exec -it {rabbitmq容器名称或者id} /bin/bash#进入容器后,cd到以下路径 cd /etc/rabbitmq/conf.d/#修改 management_agent.disable_metrics_collector false echo management_age…...
Python搭建http文件服务器实现手机电脑文件传输功能
第一种代码的界面如下:(有缺点,中文乱码) # !/usr/bin/env python3 # -*- coding:utf-8 _*-"""Simple HTTP Server With Upload. python -V3.6 This module builds on http.server by implementing the standard G…...
微信小程序实现拖拽的小球
目录 前言 js 获取微信小程序中获取系统信息 触摸移动事件的处理函数 触摸结束事件的处理函数 用于监听页面滚动事件 全局参数 html CSS 前言 小程序开发提供了丰富的API和事件处理函数,使得开发者可以方便地实现各种交互功能。其中,拖拽功能…...
uniapp的逆地理编码 和地理编码
1.先打开高德地图api找到那个 地理编码 2.封装好我们的请求 3.逆地理编码 和地理编码 都是固定的 记住自己封装的请求 就可以了 这个 是固定的 方式 下面这个是固定的 可以复制过去 getlocation就是uniapp提供的 获取经纬度 然后 下面的 就是高德地图提供的 方法 要想使用我…...
在Centos环境中搭建Nginx环境
一、Nginx概念简介 Nginx是一个轻量级的高性能HTTP反向代理服务器,同时它也是一个通用类型的代理服务器,支持绝大部分协议,如TCP、UDP、SMTP、HTTPS等。 Nginx与redis相同,都是基于多路复用模型构建出的产物,因此它与R…...
20W IP网络吸顶喇叭 POE供电吸顶喇叭
SV-29852T 20W IP网络吸顶喇叭产品简介 产品用途: ◆室内豪华型吸顶喇叭一体化网络音频解码扬声器,用于广播分区音频解码、声音还原作用 ◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车场等;室内使用效果均佳。 产品特点ÿ…...
React 之 Suspense和lazy
一. Suspense 参考链接:https://react.docschina.org/reference/react/Suspense suspense:n. 焦虑、悬念 <Suspense> 允许你显示一个退路方案(fallback)直到它的所有子组件完成加载。 <Suspense fallback{<Loadin…...
Kafka中的 ISR 机制
ISR 是什么 ISR 的全称叫做: In-Sync Replicas (同步副本集), 可以理解为和 leader 保持同步的所有副本的集合。ISR 动态维护了一个和 leader 副本保持同步副本集合,ISR 中的副本全部都和 leader 的数据保持同步。 设一个场景&a…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
