Linux——消息队列

news2025/5/25 16:34:56

目录

一、消息队列的定义

二、相关函数 

2.1 msgget 函数

2.2 msgsnd 函数

2.3 msgrcv 函数

2.4 msgctl 函数

三、消息队列的操作

 3.1 创建消息队列

3.2 获取消息队列并发送消息 

3.3 从消息队列接收消息recv 

四、 删除消息队列

4.1 ipcrm

4.2 msgctl函数 


一、消息队列的定义

消息队列是一种用于在应用程序之间传递和存储数据的通信机制。它允许应用程序将消息发送到队列中,然后由另一个应用程序从队列中接收和处理这些消息。消息队列可以有效地实现异步通信、解耦应用程序之间的依赖关系,以及实现消息的持久化和顺序处理。常见的消息队列系统包括RabbitMQ、Kafka、ActiveMQ等。消息队列在现代分布式系统和微服务架构中被广泛应用。

二、相关函数 

2.1 msgget 函数

msgget()创建或者获取一个消息队列

函数模型:

int msgget(key_t key,int msqflg);

函数参数:

        1.msqflg: IPC_CREAT

返回值:
         msgget()成功返回消息队列 ID,失败返回-1

2.2 msgsnd 函数

函数模型:

int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg);
msgsnd()发送一条消息,消息结构为:
struct msgbuf
{
        long mtype; // 消息类型, 必须大于 0
        char mtext[1]; // 消息数据
}
函数参数:
         1.msqsz: 指定 mtext 中有效数据的长度
        2.msqflg:一般设置为 0 可以设置 IPC_NOWAIT
返回值:
        msgsnd()成功返回 0, 失败返回-1

2.3 msgrcv 函数

msgrcv() 接收一条消息

函数模型:

ssize_t msgrcv(int msqid, void *msgp, size_t msqsz, long msqtyp, int msqflg);

函数参数:

         1.msqtyp: 指定接收的消息类型,类型可以为 0
        2.msqflg: 一般设置为 0 可以设置 IPC_NOWAIT
返回值:
         msgrcv()成功返回 mtext 中接收到的数据长度, 失败返回-1

2.4 msgctl 函数

msgctl() 控制消息队列

函数模型:

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

 函数参数:

        cmd: IPC_RMID
返回值:
        msgctl()成功返回 0,失败返回-1

三、消息队列的操作

 3.1 创建消息队列

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>

int main()
{
    int msgid=msgget((key_t)1234,IPC_CREAT|0600);
    if(msgid==-1)
    {
        printf("msgid err\n");
        exit(1);
    }

}

通过ipcs 命令查看是否已经创建好了消息队列

3.2 获取消息队列并发送消息 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>

struct mess
{
    long type;
    char buff[32];
};

int main()
{
    int msgid=msgget((key_t)1234,IPC_CREAT|0600);
    if(msgid==-1)
    {
        printf("msgid err\n");
        exit(1);
    }

    struct mess dt;
    dt.type=1;//1类型消息
    strcpy(dt.buff,"hello1");

    msgsnd(msgid,(void*)&dt,32,0);

}

 ipcs -q 只显示消息队列

 ipcs -m 只显示共享内存

 ipcs -s 只显示信号量

msgsnd 函数 发送消息:
msgsnd(msgid, &dt, 32, 0); 使用 msgsnd 函数向消息队列发送消息。

msgid 是之前通msgget 获取的消息队列标识符;

msgid是往哪个消息队列中添加;
&dt 是指向要发送的消息结构体的指针;
32 是要发送的消息数据的长度;
0 是消息发送的标志,这里使用默认值。

3.3 从消息队列接收消息recv 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>

struct mess
{
    long type;
    char buff[32];
};

int main()
{
    int msgid=msgget((key_t)1234,IPC_CREAT|0600);
    if(msgid==-1)
    {
        printf("msgid err\n");
        exit(1);
    }

    struct mess dt;
    msgrcv(msgid,&dt,32,1,0);
    printf("recv:%s\n",dt.buff);
}

运行此文件,会发现消息队列数会随执行的次数增加而减少

并且运行三次之后消息读完了再运行会堵塞

四、 删除消息队列

4.1 ipcrm

删除消息队列中的消息用 ipcrm -q msqid 的号。

4.2 msgctl函数 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
 
struct mess 
{
    long type; 
    char buff[32]; 
};
 
int main() 
{
    int msgid = msgget((key_t)1234, IPC_CREAT|0600);
    if (msgid == -1) 
    {
        printf("msgget err\n");
        exit(1);
    }
 
    struct mess dt;
    msgrcv(msgid, &dt, 32, 2, 0);//意思读2号消息
    printf("read msg:%s\n", dt.buff);//打印消息
 
    msgctl(msgid,IPC_RMID,NULL);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

领慧立芯LHE7909可兼容替代TI的ADS1299

LHE7909是一款由领慧立芯&#xff08;Legendsemi&#xff09;推出的24位高精度Δ-Σ模数转换器&#xff08;ADC&#xff09;&#xff0c;主要面向医疗电子和生物电势测量应用&#xff0c;如脑电图&#xff08;EEG&#xff09;、心电图&#xff08;ECG&#xff09;等设备。以下是…

MongoDB简单用法

图片中 MongoDB Compass 中显示了默认的三个数据库&#xff1a; adminconfiglocal 如果在 .env 文件中配置的是&#xff1a; MONGODB_URImongodb://admin:passwordlocalhost:27017/ MONGODB_NAMERAGSAAS&#x1f4a1; 一、为什么 Compass 里没有 RAGSAAS 数据库&#xff1f;…

uniapp-商城-26-vuex 使用流程

为了能在所有的页面都实现状态管理,我们按照前面讲的页面进行状态获取,然后再进行页面设置和布局,那就是重复工作,vuex 就会解决这样的问题,如同类、高度提炼的接口来帮助我们实现这些重复工作的管理。避免一直在造一样的轮子。 https://vuex.vuejs.org/zh/#%E4%BB%80%E4…

UDP概念特点+编程流程

UDP概念编程流程 目录 一、UDP基本概念 1.1 概念 1.2 特点 1.2.1 无连接性&#xff1a; 1.2.2 不可靠性 1.2.3 面向报文 二、UDP编程流程 2.1 客户端 cli.c 2.2 服务端ser.c 一、UDP基本概念 1.1 概念 UDP 即用户数据报协议&#xff08;User Datagram Protocol &…

Flutter项目之设置页

目录&#xff1a; 1、实现效果图2、实现流程2.1、引入依赖2.2、封装弹窗工具类2.3、设置页2.4、路由中注册设置页面 1、实现效果图 2、实现流程 2.1、引入依赖 2.2、封装弹窗工具类 import package:fluttertoast/fluttertoast.dart;class CommontToast {static showToast(Str…

通过GO后端项目实践理解DDD架构

最近在工作过程中重构的项目要求使用DDD架构&#xff0c;在网上查询资料发现教程五花八门&#xff0c;并且大部分内容都是长篇的概念讲解&#xff0c;晦涩难懂&#xff0c;笔者看了一些github上入门的使用DDD的GO项目&#xff0c;并结合自己开发中的经验&#xff0c;谈谈自己对…

天线静电防护:NRESDTLC5V0D8B

一. 物联网天线的使用环境 1.1 联网天线广泛应用于智能家居领域&#xff0c;比如智能门锁、智能摄像头等设备中&#xff0c;通过天线实现设备与家庭网络的连接&#xff0c;用户可以远程控制和监控家居设备。以智能摄像头为例&#xff0c;它通过天线将拍摄的画面实时传输到用户…

【Linux 并发与竞争】

【Linux 并发与竞争】 Linux是一个多任务操作系统&#xff0c;肯定会存在多个任务共同操作同一段内存或者设备的情况&#xff0c;多个任务甚至中断都能访问的资源叫做共享资源&#xff0c;就和共享单车一样。在驱动开发中要注意对共享资源的保护&#xff0c;也就是要处理对共享…

实用类题目

1. 密码强度检测 题目描述&#xff1a;生活中&#xff0c;为保证账户安全&#xff0c;密码需要有一定强度。编写一个方法&#xff0c;接收一个字符串作为密码&#xff0c;判断其是否符合以下强度要求&#xff1a;长度至少为 8 位&#xff0c;包含至少一个大写字母、一个小写字…

STM32F103C8T6-基于FreeRTOS系统实现步进电机控制

引言 上一篇文章讲述了如何使用蓝牙连接stm32进行数据收发控制步进电机&#xff0c;这篇在之前的基础上通过移植操作系统&#xff08;FreeRTOS或者其他的也可以&#xff0c;原理操作都类似&#xff09;实现步进电机控制。 上篇博客指路&#xff1a;STM32蓝牙连接Android实现云…

macOS安装java

一、下载 官网Java Downloads | Oracle 安装载java8,下载对应的JDK Java Downloads | Oracle 二、双击安装 安装 完成 三、查看安装位置 打开终端窗口&#xff0c;执行命令&#xff1a; /usr/libexec/java_home -V /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Content…

zkmall模块商城:B2C 场景下 Vue3 前端性能优化的广度探索与实践

ZKmall作为面向B2C场景的模块化电商平台&#xff0c;其前端性能优化在Vue3框架下的实践融合了架构设计、渲染机制与业务特性&#xff0c;形成了一套多维度的优化体系。以下从技术实现与业务适配两个维度展开分析&#xff1a; 一、Vue3响应式系统深度适配 ​Proxy驱动的精准更新…

【Netty篇】Future Promise 详解

目录 一、 Netty Future 与 Promise —— 异步世界的“信使”与“传话筒”&#x1f680;1、 理解 Netty Future2、 理解 Netty Promise 二、 代码案例解读&#x1f4bb;例1&#xff1a;同步处理任务成功&#x1f44d;例2&#xff1a;异步处理任务成功&#x1f4f2;例3&#xff…

视频分析设备平台EasyCVR安防视频管理系统,打造电石生产智能视频监控新体系

一、背景介绍 电石生产中的出炉工序是整个生产流程中最为繁重且危险的环节。在开堵炉眼的过程中&#xff0c;电石极易发生飞溅现象&#xff0c;尤其在进行吹氧操作时&#xff0c;人员灼伤的风险极高。鉴于此&#xff0c;该工序正逐步由传统的人工操作模式向智能化方向转变。然…

从 PyTorch 到 ONNX:深度学习模型导出全解析

在模型训练完毕后&#xff0c;我们通常希望将其部署到推理平台中&#xff0c;比如 TensorRT、ONNX Runtime 或移动端框架。而 ONNX&#xff08;Open Neural Network Exchange&#xff09;正是 PyTorch 与这些平台之间的桥梁。 本文将以一个图像去噪模型 SimpleDenoiser 为例&a…

Android 应用添加Tile到SystemUI QuickSettings

安卓源码里有谷歌给的关于 Tile 的说明。 frameworks/base/packages/SystemUI/docs/qs-tiles.md SystemUI QuickSettings 简称QS&#xff0c;指的是 下拉菜单里的区域。区域里的一个选项就是一个 Tile 。 下图是 frameworks/base/packages/SystemUI/docs/ 里的附图示例&#…

【MySQL】前缀索引、索引下推、访问方法,自适应哈希索引

最左前缀原则 对于INDEX(name, age)来说最左前缀可以是联合索引的最左N个字段, 也可以是字符串索引的最左M个字符。 SELECT * FROM t WHERE name LIKE 张%其效果和单独创建一个INDEX(name)的效果是一样的若通过调整索引字段的顺序, 可以少维护一个索引树, 那么这个顺序就是需要…

Android Studio开发知识:从基础到进阶

引言 Android开发作为移动应用开发的主流方向之一&#xff0c;曾吸引了无数开发者投身其中。然而&#xff0c;随着市场饱和和技术迭代&#xff0c;当前的Android开发就业形势并不乐观&#xff0c;竞争日益激烈。尽管如此&#xff0c;掌握扎实的开发技能仍然是脱颖而出的关键。本…

ocr-身份证正反面识别

在阿里云官网&#xff0c;申请一个token [阿里官方]身份证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 观察一下post请求body部分json字符串&#xff0c;我们根据这个创建一个java对象 先默认是人像面 public class IdentityBody {public String image;class configure…

单节锂电池4.2V升压5V都有哪些国产芯片推荐?国产SL4011高效,高性价比

针对单节锂电池&#xff08;4.2V&#xff09;升压至5V应用中 SL4011升压芯片 的核心优势解析&#xff0c;结合其技术参数与典型应用场景进行详细说明&#xff1a; 1. 宽输入电压与高兼容性 输入范围&#xff1a;2.7V-12V&#xff0c;完美覆盖单节锂电池全周期电压&#xff08;3…