《Linux系统编程篇》消息队列(Linux 进程间通信(IPC))——基础篇

news2024/12/24 9:17:22

文章目录

  • 引言
    • 消息队列(Message Queue)
    • 消息队列的特点
    • 消息队列的特性
    • 消息队列的操作
    • ipcs -q 拓展
    • ipcrm 拓展
    • 注意事项
  • 结论

“山重水复疑无路,柳暗花明又一村。” ——陆游

引言

《Linux系统编程篇》——基础篇首页传送门
想象一下,你正在开发一个多任务处理的应用程序,其中需要不同的模块之间进行数据交换和协作。这时,消息队列就像是一个快递站,负责接收、存储和转发各个模块之间的信息。发送者将消息放入队列,接收者则可以从队列中取出消息并进行处理,实现了模块之间的解耦和异步通信。

消息队列(Message Queue)

消息队列是一种更高级的 IPC 方式,允许多个进程之间以消息的形式进行数据交换。消息队列提供了有序的数据传输,并且允许对消息进行优先级排序。

消息队列是存放消息的链表,他存在于Linux内核当中,每一个消息队列用一个标识符也就是队列id来标识。

消息队列的特点

1、消息队列可以独立发送与接受,成功创建后,如果进程结束,消息队列节点并不会消失,他的消失是由Linux内核 来管理的
2、消息队列是面向记录的,有特定格式及特点的优先级
3、消息队列可以实现消息的随机查询,消息不一定要以先进先出的顺序依次读取,也可以使用消息类型读取。

消息队列的特性

  • 异步通信:发送方和接收方不需要同时在线,可以分别发送和接收消息。

  • 消息缓存:消息队列可以缓存一定数量的消息,接收方可以按需处理。

  • 消息优先级:消息队列通常支持消息的优先级设定,确保重要消息被优先处理。

  • 消息持久性:消息队列通常支持消息的持久化,即使接收方不在线,消息也不会丢失。

函数原型及结构体

typedef struct msgbuf {
        long mtype;       /* message type, must be > 0 */
        char mtext[128];    /* message data */
}msg;
//获取消息队列id号
int msgget(key_t key, int msgflg);
//发送消息
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//接受消息
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
//控制队列(用来销毁)
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

一图带你了解消息队列
在这里插入图片描述

消息队列的操作

  • 创建消息队列:使用msgget系统调用创建消息队列,返回一个标识符(消息队列ID)。

  • 发送消息:使用msgsnd系统调用向消息队列发送消息。

  • 接收消息:使用msgrcv系统调用从消息队列接收消息。

  • 删除消息队列:使用msgctl系统调用删除不再需要的消息队列。

用法

  1. 使用 msgget() 创建或获取消息队列。
  2. 使用 msgsnd() 发送消息,msgrcv() 接收消息。
  3. 消息队列通过键值(key)来标识,且在内核中驻留。

示例代码:

本次的示例代码为单进程,可以分为两个文件,实现多进程的消息队列通讯,学员们可以自己动手敲一下感受一下。

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>

struct msg_buffer {
    long msg_type;
    char msg_text[100];
} message;

int main() {
    key_t key = ftok("progfile", 65); // 生成消息队列键
    int msgid = msgget(key, 0666 | IPC_CREAT); // 创建消息队列

    // 向消息队列发送消息
    message.msg_type = 1;
    strcpy(message.msg_text, "Hello from sender!");
    msgsnd(msgid, &message, sizeof(message), 0);

    printf("Sent message: %s\n", message.msg_text);

    // 接收消息
    msgrcv(msgid, &message, sizeof(message), 1, 0);
    printf("Received message: %s\n", message.msg_text);

    msgctl(msgid, IPC_RMID, NULL); // 删除消息队列
    return 0;
}

运行结果
在这里插入图片描述

ipcs -q 拓展

在Linux系统中,可以使用ipcs命令来查看系统中的消息队列信息。ipcs命令可以列出系统中当前存在的进程间通信(IPC)对象,包括消息队列、信号量和共享内存。

信号量和共享内存我们以后会介绍到。

ipcs -q

这将列出系统中所有的消息队列,包括它们的标识符(ID)、拥有者、权限、大小等信息。您可以通过这些信息了解系统中消息队列的使用情况。
在这里插入图片描述
如果在上述代码中不删除则会
在这里插入图片描述

ipcrm 拓展

在Linux系统中,您可以使用ipcrm命令手动删除消息队列。ipcrm命令用于删除System V IPC 对象(包括消息队列、信号量和共享内存)。

要手动删除消息队列,您需要知道消息队列的标识符(ID)。首先,您可以使用ipcs -q命令列出系统中的消息队列及其ID,然后选择要删除的消息队列的ID。

ipcrm -q <queue_id>

其中,<queue_id> 是要删除的消息队列的标识符(ID)。

例如,如果要删除标识符为12345的消息队列,您可以运行以下命令:

ipcrm -q 12345

比如我要手动删除我刚刚没有删除的的消息队列。
在这里插入图片描述

注意事项

  1. 消息格式一致性:发送和接收进程之间必须约定好消息的格式,包括消息的大小、结构和编码方式。确保发送的消息可以被接收进程正确解析和处理。

  2. 消息队列容量:消息队列有容量限制,当消息队列满时,发送进程可能被阻塞或消息被丢弃。需要根据实际需求设置合适的消息队列容量,避免消息丢失或系统阻塞。

  3. 进程同步:在使用消息队列进行通信时,需要考虑进程之间的同步和互斥,避免出现竞争条件和数据不一致的情况。可以使用信号量等机制来实现进程间的同步。


结论

消息队列通常用于进程间通信,特别是在需要解耦发送者和接收者、实现异步通信的情况下。

通过学习消息队列,希望学员们将能够更好地理解并应用进程间通信的技术,为构建复杂的软件系统打下坚实的基础。

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

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

相关文章

微服务设计模式 - 重试模式(Retry Pattern)

微服务设计模式 - 重试模式&#xff08;Retry Pattern&#xff09; 定义 重试模式&#xff08;Retry Pattern&#xff09;是一种微服务中的设计模式&#xff0c;用于在临时性失败&#xff08;如网络故障或暂时不可用的服务&#xff09;发生时&#xff0c;自动重新尝试请求&…

『 Linux 』网络传输层 - TCP(二)

文章目录 TCP六个标志位TCP的连接三次握手 四次挥手为什么是三次握手和四次挥手 重传机制 TCP六个标志位 在TCP协议报文的报头中存在一个用于标志TCP报文类型的标志位(不考虑保留标志位),这些标志位以比特位选项的方式存在,即对应标志位为0则表示为假,对应标志位为1则为真; SYN…

VLAN虚拟局域网,eNSP实验讲解

VLAN虚拟局域网&#xff0c;eNSP实验讲解 一、概念二、eNSP仿真实验1、实验一&#xff1a;vlan演示&#xff08;交换机端口access模式&#xff09;2、实验二&#xff1a;vlan演示&#xff08;交换机端口trunk模式&#xff09; 一、概念 VLAN&#xff08;Virtual Local Area Ne…

Ubuntu UFW防火墙规则与命令示例大全

在服务器安全领域&#xff0c;防火墙是守护网络安全的坚实盾牌。UFW&#xff08;Uncomplicated Firewall&#xff09;&#xff0c;即“不复杂的防火墙”&#xff0c;是一个运行在iptables之上的防火墙配置工具&#xff0c;它为Ubuntu系统默认提供了一个简洁的命令行界面&#x…

基于 Python 的 Django 框架开发的电影推荐系统

项目简介&#xff1a;本项目是基于 Python 的 Django 框架开发的电影推荐系统&#xff0c;主要功能包括&#xff1a; 电影信息爬取&#xff1a;获取并更新电影数据。数据展示&#xff1a;提供电影数据的列表展示。推荐系统&#xff1a;基于协同过滤算法实现个性化推荐。用户系…

ORB-SLAM2源码学习:ORBextractor.cc:IC_Angle 利用灰度质心法求解关键点方向角

ORB特征点&#xff1a; 特征点是由关键点和描述子两部分组成&#xff0c;关键点是指特征点在图像中的位置&#xff0c;描述子是用来描述关键点周围的像素信息。ORB关键点是在FAST关键点的基础上进行改进给像素增加了一个主方向&#xff0c;称为Oriented FAST。描述子在BRIEF的…

【设计模式】如何用C++实现依赖倒置

【设计模式】如何用C实现依赖倒置 一、什么是依赖倒置&#xff1f; 依赖倒置原则&#xff08;Dependency Inversion Principle&#xff0c;DIP&#xff09;是SOLID面向对象设计原则中的一项。它的核心思想是&#xff1a; 高层模块不应该依赖于低层模块&#xff0c;两者都应该…

‌植物神经紊乱患者,这些锻炼适合你!

植物神经紊乱是一种常见的心理疾病&#xff0c;其主要症状包括焦虑、抑郁、失眠等&#xff0c;严重时还可能出现心慌、气短、憋气、出汗异常等症状。然而&#xff0c;通过适量的锻炼&#xff0c;我们可以帮助调节自主神经系统&#xff0c;缓解这些症状。那么&#xff0c;植物神…

Golang | Leetcode Golang题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; func findMaxLength(nums []int) (maxLength int) {mp : map[int]int{0: -1}counter : 0for i, num : range nums {if num 1 {counter} else {counter--}if prevIndex, has : mp[counter]; has {maxLength max(maxLength, i-prevIndex)} …

第十七届山东省职业院校技能大赛通知分享

近日&#xff0c;山东省教育厅联合相关部门发布了关于举办第十七届山东省职业院校技能大赛的通知&#xff0c;标志着这一旨在深化教育教学改革、推进产教融合与校企合作的重要赛事即将拉开帷幕。 据了解&#xff0c;本次大赛将设中等职业教育组和高等职业教育组&#xff0c;共包…

Angular实现gridview效果

说明&#xff1a;使用angular实现grid效果&#xff0c;支持文字图片多条数据展示 效果图: step1: <mat-grid-list cols"2" rowHeight"2:1"><mat-grid-tile *ngFor"let course of courses">{{ course }}</mat-grid-tile> &l…

web of sicence使用教程(研究生版)

学习视频链接 进入web of science 通过校园资料库进入进入&#xff0c;选择如下 核心检索规则 不区分字母大小写逻辑运算符 可以通过括号改变优先级 常用通配符 短语检索 检索界面 检索类型 选择数据库

2-8软件包管理

8.1 配置仓库 1.配置本地仓库 #进行代码安装前需要先进行仓库配置和挂载 [rootlocalhost ~]# cd /etc/yum.repos.d [rootlocalhost yum.repos.d]# vim base.repo [baseos] namebaseos baseurl/mnt/BaseOS gpgcheck0 [appstream] nameappstream baseurl/mnt/AppStream gp…

适配器模式:类适配器与对象适配器

适配器模式是一种结构性设计模式&#xff0c;旨在将一个接口转换成客户端所期望的另一种接口。它通常用于解决由于接口不兼容而导致的类之间的通信问题。适配器模式主要有两种实现方式&#xff1a;类适配器和对象适配器。下面&#xff0c;我们将详细探讨这两种方式的优缺点及适…

性能测试:性能测试流程与方法

性能测试流程是指在进行性能测试时所遵循的一系列步骤和阶段&#xff0c;以确保对系统的全面测试和评估。性能测试流程的具体步骤可能会因组织、项目和测试需求而有所不同。 性能测试流程 分析现状&#xff1a;首先需要对应用程序或系统进行详细的分析&#xff0c;了解其当前的…

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦&#xff01;&#x1f929; 基本配置 打包工具&#xff1a;Vite 前端框架&#xff1a;ElementPlus 开发语言&#xff1a;Vue3、TypeScript、Sass 代码检查&#xff1a;ESLint、Prettier IDE&#xf…

Java已死,大模型才是未来?

作者&#xff1a;不惑_ 引言 在数字技术的浪潮中&#xff0c;编程语言始终扮演着至关重要的角色。Java&#xff0c;自1995年诞生以来&#xff0c;便以其跨平台的特性和丰富的生态系统&#xff0c;成为了全球范围内开发者们最为青睐的编程语言之一 然而&#xff0c;随着技术的…

Allegro: 开源的高级视频生成模型

我们很高兴地宣布 Allegro 的开源发布&#xff0c;这是 Rhymes AI 先进的文本到视频模型。Allegro 是一款功能强大的人工智能工具&#xff0c;能将简单的文字提示转化为高质量的视频短片&#xff0c;为人工智能生成视频领域的创作者、开发者和研究人员开辟了新的可能性。我们希…

【OD-支持在线评测】智能驾驶(200分)

📎 在线评测链接 https://app5938.acapp.acwing.com.cn/contest/11/problem/OD1073 🍓 OJ题目截图 🍿 最新机试E卷,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 94 分 🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系解锁~ 文章目录 📎…

SpringBoot【实用篇】- 配置高级

文章目录 目标&#xff1a;1.ConfigurationProperties2.宽松绑定/松散绑定3. 常用计量单位绑定4.数据校验 目标&#xff1a; ConfigurationProperties宽松绑定/松散绑定常用计量单位绑定数据校验 1.ConfigurationProperties ConfigurationProperties 在学习yml的时候我们了解…