【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…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
