当前位置: 首页 > news >正文

【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命令 消息队列的概念 消息队列提供进程间数据块传输的方法&#xff0c;传输的每一个数据块都认为是有类型的&#xff0c;不同的数据块是有优…...

一次Linux中的木马病毒解决经历(6379端口---newinit.sh)

病毒入侵解决方案 情景 最近几天一直CPU100%,也没有注意看到了以为正常的服务调用,直到腾讯给发了邮件警告说我的服务器正在入侵其他服务器的6379端口,我就是正常的使用不可能去入侵别人的系统的,这是违法的. 排查 既然入侵6379端口,就怀疑是通过我的Redis服务进入的我的系统…...

ProtoBuf

文章目录 1.认识 ProtoBuf2. 安装ProtoBuf3. 快速上手 ProtoBuf4. proto3 语法5. probuf 实战6. 总结 1.认识 ProtoBuf 在认识 啥是 ProtoBuf 之前我们先来 回顾一下 &#xff08;或 了解 一下 啥是 序列化&#xff09; 序列化概念回顾 : 图一 : 回顾 序列化 &#xff0c;下面…...

AJ-Captcha行为验证在vue中的使用

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目场景&#xff1a;由原先的验证码校验升级为行为验证校验 使用方法 提示&#xff1a;参考文档&#xff1a; 参考文档&#xff1a;vue使用AJ-Captcha文档 gitee地址&#xff1a;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都需要保存到某个地方&#xff0c;这样他们的manifest在api server重启和失败的时候才不会丢失。 只有api server能访问etcd&#xff0c;其它组件只能间接访问etcd的好处是 增强乐观锁系统及验证系统的健壮性 方便后续存储的替换…...

【HarmonyOS】【DevEco Studio】ohpm安装失败该如何解决?

【关键词】 HarmonyOS、DevEco Studio、ohpm安装失败 【问题背景及解决方案】 最近遇到很多DevEco Studio安装ohpm失败的问题&#xff0c;下面给大家介绍几种出现的问题以及解决方案&#xff1a; 1、ohpm not set up&#xff0c;报错截图如下&#xff1a; ​ 解决方案&…...

STM32 cubemx CAN

接收用到的结构体如下&#xff1a;CAN概念&#xff1a; 全称Controller Area Network&#xff0c;是一种半双工&#xff0c;异步通讯。 物理层&#xff1a; 闭环&#xff1a;允许总线最长40m&#xff0c;最高速1Mbps&#xff0c;规定总线两端各有一个120Ω电阻&#xff0c;闭环…...

贴片电阻封装尺寸及焊盘尺寸

1、贴片电阻封装尺寸 有英制和公制之分&#xff0c;英制的单位是inch&#xff0c;公制的单位是m&#xff1b;&#xff08;m、cm、mm只是进制不同&#xff09; 通常说的都是英制&#xff0c;比如0603指的是inch单位下的0.06inch和0.03inch&#xff1b; 下图有inch和mm的对照、…...

软考笔记——9.软件工程

软件工程的基本原理&#xff1a;用分阶段的生命周期计划严格管理、坚持进行阶段评审、实现严格的产品控制、采用现代程序设计技术、结果应能清除的审查、开发小组的人员应少而精、承认不断改进软件工程事件的必要性。 软件工程的基本要素&#xff1a;方法、工具、过程 软件生…...

uniapp小程序实现上传图片功能,并显示上传进度

效果图&#xff1a; 实现方法&#xff1a; 一、通过uni.chooseMedia(OBJECT)方法&#xff0c;拍摄或从手机相册中选择图片或视频。 官方文档链接: https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia uni.chooseMedia({count: 9,mediaType: [image,video],so…...

基于物理场的动态模式分解(piDMD)研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&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#进入容器后&#xff0c;cd到以下路径 cd /etc/rabbitmq/conf.d/#修改 management_agent.disable_metrics_collector false echo management_age…...

Python搭建http文件服务器实现手机电脑文件传输功能

第一种代码的界面如下&#xff1a;&#xff08;有缺点&#xff0c;中文乱码&#xff09; # !/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和事件处理函数&#xff0c;使得开发者可以方便地实现各种交互功能。其中&#xff0c;拖拽功能…...

uniapp的逆地理编码 和地理编码

1.先打开高德地图api找到那个 地理编码 2.封装好我们的请求 3.逆地理编码 和地理编码 都是固定的 记住自己封装的请求 就可以了 这个 是固定的 方式 下面这个是固定的 可以复制过去 getlocation就是uniapp提供的 获取经纬度 然后 下面的 就是高德地图提供的 方法 要想使用我…...

在Centos环境中搭建Nginx环境

一、Nginx概念简介 Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 Nginx与redis相同&#xff0c;都是基于多路复用模型构建出的产物&#xff0c;因此它与R…...

20W IP网络吸顶喇叭 POE供电吸顶喇叭

SV-29852T 20W IP网络吸顶喇叭产品简介 产品用途&#xff1a; ◆室内豪华型吸顶喇叭一体化网络音频解码扬声器&#xff0c;用于广播分区音频解码、声音还原作用 ◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车场等&#xff1b;室内使用效果均佳。 产品特点&#xff…...

React 之 Suspense和lazy

一. Suspense 参考链接&#xff1a;https://react.docschina.org/reference/react/Suspense suspense&#xff1a;n. 焦虑、悬念 <Suspense> 允许你显示一个退路方案&#xff08;fallback&#xff09;直到它的所有子组件完成加载。 <Suspense fallback{<Loadin…...

Kafka中的 ISR 机制

ISR 是什么 ISR 的全称叫做&#xff1a; In-Sync Replicas &#xff08;同步副本集&#xff09;, 可以理解为和 leader 保持同步的所有副本的集合。ISR 动态维护了一个和 leader 副本保持同步副本集合&#xff0c;ISR 中的副本全部都和 leader 的数据保持同步。 设一个场景&a…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

计算机系统结构复习-名词解释2

1.定向&#xff1a;在某条指令产生计算结果之前&#xff0c;其他指令并不真正立即需要该计算结果&#xff0c;如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方&#xff0c;那么就可以避免停顿。 2.多级存储层次&#xff1a;由若干个采用不同实现技术的存储…...