【Linux】System V 消息队列(不重要)

一、消息队列的原理

  • 一个进程给另一个进程发送类型数据块的方式
  • 每一个数据快都被认为是有一个类型的,接收者进程接收的数据快可以有不同的类型值

二、消息队列的接口

和共享内存的接口很像:

消息队列的创建
创建消息队列我们需要用msgget函数,msgget函数的函数原型如下:

int msgget(key_t key, int msgflg);
1
说明一下:

创建消息队列也需要使用ftok函数生成一个key值,这个key值作为msgget函数的第一个参数。
msgget函数的第二个参数,与创建共享内存时使用的shmget函数的第三个参数相同。
消息队列创建成功时,msgget函数返回的一个有效的消息队列标识符(用户层标识符)。
消息队列的释放
释放消息队列我们需要用msgctl函数,msgctl函数的函数原型如下:

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
1
说明一下:
msgctl函数的参数与释放共享内存时使用的shmctl函数的三个参数相同,只不过msgctl函数的第三个参数传入的是消息队列的相关数据结构。

向消息队列发送数据
向消息队列发送数据我们需要用msgsnd函数,msgsnd函数的函数原型如下:

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
1
msgsnd函数的参数说明:

第一个参数msqid,表示消息队列的用户级标识符。
第二个参数msgp,表示待发送的数据块。
第三个参数msgsz,表示所发送数据块的大小
第四个参数msgflg,表示发送数据块的方式,一般默认为0即可。
msgsnd函数的返回值说明:

msgsnd调用成功,返回0。
msgsnd调用失败,返回-1。
其中msgsnd函数的第二个参数必须为以下结构:

struct msgbuf{
    long mtype;       /* message type, must be > 0 */
    char mtext[1];    /* message data */
};
1
2
3
4
注意: 该结构当中的第二个成员mtext即为待发送的信息,当我们定义该结构时,mtext的大小可以自己指定。

从消息队列获取数据
从消息队列获取数据我们需要用msgrcv函数,msgrcv函数的函数原型如下:

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
1
msgrcv函数的参数说明:

第一个参数msqid,表示消息队列的用户级标识符。
第二个参数msgp,表示获取到的数据块,是一个输出型参数。
第三个参数msgsz,表示要获取数据块的大小
第四个参数msgtyp,表示要接收数据块的类型。
msgrcv函数的返回值说明:

msgsnd调用成功,返回实际获取到mtext数组中的字节数。
msgsnd调用失败,返回-1。

三、消息队列的指令操作

IPC资源必须删除,否则不会自动清除,除非重启,消息队列的生命周期也是随内核的

// 可以查看系统中的消息队列
ipcs -p
// 可以查看系统中的共享内存
ipcs -m
// 可以查看系统中的消息队列,共享内存和信号量
ipcs 
// 进行删除系统中的消息队列
ipcrm -q msgid

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

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

相关文章

logging二次封装

import logging import os import time from logging.handlers import RotatingFileHandlerclass Logger():logs_dir os.path.dirname(os.path.dirname(os.path.abspath(__file__))) \\report\\logsdef __init__(self, name):self.logger logging.getLogger(name)#设置级别…

JavaScript函数进阶学习

文章目录 JavaScript函数进阶函数提升作用流程 函数参数动态参数剩余参数展开运算符 箭头函数基本语法箭头函数参数箭头函数的this 遍历数组的forEach方法语法 JavaScript函数进阶 函数提升 函数有时可以先调用再声明。 作用流程 函数提升的作用流程与变量提升类似&#xf…

移动端框架:加速移动应用开发与提升跨平台兼容性

在当今快速发展的移动应用领域,开发者们面临着如何快速构建、维护并发布跨平台应用的挑战。为了应对这一挑战,移动端框架应运而生,它们不仅加速了移动应用的开发流程,还提升了应用的跨平台兼容性,并确保了应用性能与原…

C++的算法:动态规划算法

动态规划(Dynamic Programming,简称DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。 动态规划的基本步骤: 1. 描述问题的最优解的结构:确定问题的…

2024/6/2 英语每日一段

However, they denied Hirst had been deliberately misleading, arguing that it was his “usual practice” to date physical works in a conceptual art project with the date of the project’s conception, which in the case of The Currency was 2016. Hirst and Sci…

Python | 自动探索性数据分析(EDA)库SweetViz

SweetViz是一个开放源代码Python库,主要用于生成精美的高密度可视化文件,启动探索性数据分析(EDA),输出为完全独立的HTML应用程序。 探索性数据分析(EDA)是分析和总结数据集主要特征的过程&…

uni-app(优医咨询)项目实战 - 第7天

学习目标: 能够基于 WebSocket 完成问诊全流程 能够使用 uniCloud 云存储上传文件 能够完成查看电子处方的功能 能够完成医生评价的功能 一、问诊室 以对话聊天的方式向医生介绍病情并获取诊断方案,聊天的内容支持文字和图片两种形式。 首先新建一…

AOP案例

黑马程序员JavaWeb开发教程 文章目录 一、案例1.1 案例1.2 步骤1.2.1 准备1.2.2 编码 一、案例 1.1 案例 将之前案例中增、删、改相关节后的操作日志记录到数据库表中。 操作日志:日志信息包含:操作人、操作时间、执行方法的全类名、执行方法名、方法…

网关(Gateway)- 内置过滤器工厂

官方文档:Spring Cloud Gateway 内置过滤器工厂 AddRequestHeaderGatewayFilterFactory 为请求添加Header Header的名称及值 配置说明 server:port: 8088 spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8847username: nacospassword: …

Java中的垃圾回收机制详解

一、技术难点 Java中的垃圾回收机制(Garbage Collection, GC)是Java语言的一个核心特性,它负责自动管理堆内存中的对象,自动回收不再使用的对象占用的内存空间,从而避免了C/C等语言中常见的内存泄漏和野指针问题。然而…

52.WEB渗透测试-信息收集-CDN识别绕过(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:51.WEB渗透测试-信息收集-CDN识别绕过(4) 端口扫描其他内容参考&…

几何裁剪技术在AI去衣应用中的革新作用

引言: 随着人工智能技术的飞速发展,其在图像处理领域的应用也日益广泛。特别是在AI去衣技术中,几何裁剪技术扮演着至关重要的角色。本文将深入探讨几何裁剪技术在AI去衣中的应用及其带来的影响。 一、几何裁剪技术概述 几何裁剪技术是一种基…

容器技术的发展与影响

一、引言 容器技术近年来在软件开发和运维领域引起了广泛关注。本文将探讨容器技术的发展历程、其在技术领域的应用及其深远影响。 二、容器技术的发展历程 1.1 初期的容器技术 容器技术并非新概念,其历史可以追溯到Unix操作系统。早在20世纪70年代,…

【线性表】顺序存储和链式存储的实现

文章目录 顺序存储链式存储单向链表循环链表 线性表的定义 (1)概念定义:用数据元素的有限序列表示叫做线性表;线性表中数据元素的类型可以为简单类型,也可以为复杂类型。许多实际应用问题所涉的基本操作有很大相似性,不应为每个具…

DALL-2E是什么?它有什么功能和特性?它值不值得我们去学习?我们该如何去学习呢?

1.DALL-2E是什么? DALL-2E 是一个智能对话生成模型,其全称为Diverse All-round Language Generation for Effective Conversation。该模型是由微软研究院于2022年开发的,目的是为了提高对话生成系统在多样性和全面性方面的表现。 DALL-2E 基…

建模杂谈系列244 TimeTraveller

说明 所有的基于时间处理和运行的程序将以同样的节奏同步和执行 TT(TimeTraveller)是一个新的设计,它最初会服务与量化过程的大量任务管理:分散开发、协同运行。但是很显然,TT的功能将远不止于此,它将服务大量的,基于时…

【四大组件】-- 内容提供器 ContentProvider

目录 内容提供器 ContentProvider定义,是什么作用,为什么原理,机制使用方法统一资源标识符 URIMIMEUriMatcherContentUrisContentProviderContentResolver监听数据变化 总结面试问题 内容提供器 ContentProvider Android ContentProvider 基…

【spring】第二篇 bean实例化

对象已经能交给Spring的IOC容器来创建了,但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程,在这块内容中主要解决两部分内容,分别是 bean是如何创建的 实例化bean的三种方式,构造方法,静态工厂和实例工厂 在讲解这…

Linux C/C++时间操作

C11提供了操作时间的库chrono库,从语言级别提供了支持chrono库屏蔽了时间操作的很多细节,简化了时间操作 Unix操作系统根据计算机产生的年代把1970年1月1日作为UNIX的纪元时间,1970年1月1日是时间的中间点,将从1970年1月1日起经过…

WPF -> MVVM

1.1安装MVV MLight 打开 Visual Studio 2022。 在顶部菜单栏中选择“工具” -> “NuGet 包管理器” -> “程序包管理器控制台”。 在控制台中输入以下命令,并按回车键运行: Install-Package MvvmLightLibsStd104.等待安装完成后,你就…