【Linux】进程间通信之消息队列

news2025/1/16 1:45:59

系列目录

进程间通信——共享内存

进程间通信——信号量

文章目录

一、概念

二、消息队列函数

1.msgget

2.magsnd

3.msgrcv

4.msgctl

三、掌握消息队列操作


一、概念

  • 提供了一种从另一种进程发送一个数据块的方法。而且每个数据块都被认为含有一个类型,接收进程可以独立的接收含有不同类型值的数据块。
  • 可以在两个不相关的进程之间传递数据
  • 例如进程a向消息队列中添加消息,进程b可以通过消息队列a的标识符与a访问同一块消息队列,此时b在消息队列中接收a发送的消息,已读(被接收到)的消息”离开“消息队列,被读取过后的消息不会存在在消息队列中,而未读消息保存在消息队列中。
  • 有两种情况会导致消息队列的阻塞:1.进程对空的消息队列进行读取。2.进程读取的消息队列与已有消息类型不匹配(也就是,消息队列有123消息,进程访问4类型的消息肯定就会阻塞)。
  • 进程访问完消息队列会结束进程,但是消息队列会一直在,它不跟进程之间没有绝对的共存。
  • 消息队列存放在内核中,物理内存上,重启系统后消息队列会消失。
  • 进程可读取”0“号消息队列的消息,”0“号消息的含义是当进程读取消息时不要区分消息的类型,有什么读什么。

二、消息队列函数

头文件

#include<sys/msg.h>

函数: 

int msgctl(int msqid,int cmd,struct msqid_ds *buf);
int msgget(key_t key,int msgflg);
int msgrcv(int msqid,void *msg_ptr,size_t msg_sz,long int msgtype,int msgflg);
int msgsnd(int msqid,const void *msg_ptr,size_t msg_sz,int msgflg);

1.msgget

int msgget(key_t key,int msgflg);
  • 作用:用来创建和访问一个消息队列
  • IPC_PRIVATE创建私有队列
  • 参数:
    • 第二个参数msgflg是由9个权限标志组成。IPC_CREAT创建消息队列
  • 返回值:成功时返回一个正整数,即队列标识符,失败返回-1

2.magsnd

int msgsnd(int msqid,const void *msg_ptr,size_t msg_sz,int msgflg);
  • 作用:用来把消息添加到消息队列中
  • 消息的结构受到两个方面的约束。首先,它的长度必须小于系统规定的上限,其次,它鄙俗以一个长整型成员变量开始,接收函数将用这个成员变量来确定消息的类型,如下,把消息结构定义为:
    struct my_message{
        long int message_type;
        ...
    };
  • 参数:
    • 第一个参数msqid是由msgget函数返回的消息队列标识符
    • 第二个参数msg_ptr是一个指向准备发送消息的指针
    • 第三个参数msg_sz是msg_ptr指向的消息长度
    • 第四个参数msgflg控制在当前消息队列满或队列消息达到系统范围的限制时及将要发生的事情
  • 返回值:成功时返回0,失败返回-1,如果调用成功,消息数据的一份副本被放到消息队列中。

3.msgrcv

int msgrcv(int msqid,void *msg_ptr,size_t msg_sz,long int msgtype,int msgflg);
  • 作用:从一个消息队列中获取消息
  • 参数:
    • 第一个参数msqid是由msgget函数返回的消息队列标识符
    • 第二个参数msg_ptr是一个指向准备发送消息的指针
    • 第三个参数msg_sz是msg_ptr指向的消息长度
    • 第四个参数msgtyoe是一个长整数,实现一种简单形式的接收优先级
    • 第五个参数msgflg控制在当前消息队列满或队列消息达到系统范围的限制时及将要发生的事情
  • 返回值:成功时msgrcv函数返回放到接收缓冲区中的字符数,消息被复制到由msg_ptr指向的用户分配的缓存区中,删除消息队列的对应消息,失败时返回-1。

4.msgctl

int msgctl(int msqid,int cmd,struct msqid_ds *buf);
  • 作用:与共享内存中的控制函数相似
  • 结构体struct msqid_ds:
  • struct msqid_ds{
        uid_t msg_perm.uid;
        uid_t msg_perm.gid;
        mode_t msg_perm.mode;
    };
  • 参数:
    • 第一个参数msqid是由msgget函数返回的消息队列标识符
    • 第二个参数command是将要采取的动作
  • 返回值:成功时返回0,失败时返回-1

三、掌握消息队列操作

通过代码掌握消息队列是如何发送与接收消息

在消息队列中添加消息:

message.c:发送消息”hello1",该进程运行一次,就会有1个“hello1"被添加入消息队列中。

#include<stdio.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
//定义消息
struct mess
{
	long type;
	char data[128];
};
int main()
{
	int msgid=msgget((key_t)1235,IPC_CREAT|0600);//添加一次,后面再使用就是获取消息
	if(msgid==-1)
	{
		exit(0);
	}
	struct mess dt;
	dt.type=1;
	strcpy(dt.data,"hello1");
	//1号消息内容hello1
	msgsnd(msgid,(void*)&dt,128,0);//标志位0
	//消息队列不用移除
}

如下图所示,对message.c编译为mess,执行该文件1次,执行ipcs命令查看发现消息队列被添加一次

在消息队列中读取消息

编译message1.c读取消息队列中消息:

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

struct mess
{
	long type;
	char data[128];
};
int main()
{
	int msgid=msgget((key_t)1235,IPC_CREAT|0600);
	if(msgid==-1)
	{
		exit(0);
	}
	struct mess dt;
	msgrcv(msgid,(void*)&dt,128,1,0);
	printf("%s",dt.data);
}

如下图所示,对message1.c编译为mess1,执行该程序,发现a1写入的”hello1“被读取输出在屏幕上。

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

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

相关文章

Python3《机器学习实战》学习笔记(十):ANN人工神经网络代码详解(数字识别案例以及人脸识别案例)

文章目录一、构建基本代码结构1.1预处理数据的工具包1.2 初始化参数1.3工具类sigmoid1.4工具类矩阵变换1.5初始化theta1.6正向传播1.7反向传播1.8梯度下降1.9训练模块二、MNIST数字识别三、人脸识别四、总结一、构建基本代码结构 1.1预处理数据的工具包 """Dat…

2021年认证杯SPSSPRO杯数学建模C题(第一阶段)破局共享汽车求解全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 C题 破局共享汽车 原题再现&#xff1a; 自 2015 年以来&#xff0c;共享汽车行业曾经“百花齐放”&#xff0c;多个项目获得巨额融资。但因为模式过重、运营成本过高、无法盈利等问题&#xff0c;陆续有共享汽车公司因为资金链断裂而倒闭。据…

RocketMQ存储设计的奥妙

RocketMQ作为一款基于磁盘存储的中间件&#xff0c;具有无限积压能力&#xff0c;并提供高吞吐、低延迟的服务能力&#xff0c;其最核心的部分必然是它优雅的存储设计。 1、存储概述 RocketMQ存储的文件主要包括Commitlog文件、ConsumeQueue文件、Index文件。 RocketMQ将所有…

温振传感器有几种传输方式?

在现代化社会中&#xff0c;各种机器无时无刻参与着我们的日常生活&#xff0c;承担在我们的周围承担起重要作用&#xff0c;轴承、电机、泵体等也成为工业文明中关键存在&#xff0c;它们的温度和状态影响着整个工业自动化系统运行的健康和效率。 长期以来&#xff0c;传感器技…

数字集成电路设计(四、Verilog HDL数字逻辑设计方法)(一)

文章目录1.Verilog语言的设计思想和可综合特性2. 组合电路的设计2.1 数字加法器2.2 数据比较器2.3 数据选择器2.4 数字编码器2.4.1 3位二进制8线-3线编码器2.4.2 8线-3线优先编码器2.4.3 二进制转化十进制8421BCD编码器&#xff08;重要&#xff09;2.4.4 8421BCD十进制余3编码…

ue4使用Niagara粒子实现下雨效果,使用蓝图调节雨量

一、使用Niagara粒子系统实现下雨效果 1. 首先创建一个雨水的材质 新建 — 材质 2. 创建Niagara系统 新建 新建 — FX — Niagara系统 — 来自所选发射器的新系统 — 下一步 — 选择Fountain — 点击号&#xff0c;点击完成 删除下面的“Add Velocity in Cone” 添加“…

矩池云如何自定义端口,访问自己的web项目

本文将向您介绍如何在矩池云租用服务器的时候自定义端口&#xff0c;并将您的 web 项目部署到自定义端口&#xff0c;最后实现在本地通过自定义端口对应链接访问服务。 上传代码和数据 首先&#xff0c;您需要将本地的项目代码和数据上传到矩池云网盘。这里为了方便您测试使用…

类似ps的python工具lama cleaner

Lama Cleaner是个类似ps图片的工具&#xff0c;可以把图片中不想要的部分p掉&#xff0c;或者填补图片中丢失的部分。用下来感觉还蛮靠谱&#xff0c;对于不会ps的人是福音&#xff0c;记录一下。 相关介绍&#xff1a;https://github.com/Sanster/lama-cleaner 1.安装 安装…

react 中 ref 管理列表

背景 最近在看 react 新的官方文档 的时候&#xff0c;看到这么一个标题&#xff0c;How to manage a list of refs using a ref callback&#xff0c;就是一个图片的列表&#xff0c;类似这样 然后点击按钮的时候&#xff0c;通过 scrollIntoView 这个 api 来让他滚动&#…

python生成模拟微信气泡图片

0. 起因 众所周知&#xff0c;借刀杀人最为致命&#xff0c;聊天也是如此。 最近我的群聊画风逐渐变味&#xff1a; 当然&#xff0c;这种图片的生产成本很低&#xff0c;只需在设置页关闭昵称显示&#xff0c;把聊天背景重置为灰色&#xff0c;然后利用截图工具截图&#xf…

【金融项目】尚融宝项目(十三)

25、充值 25.1、需求介绍 25.1.1、投资人充值 **1、需求描述 ** 标的产生后&#xff0c;平台展示标的&#xff0c;投资人就可以在平台投资标的&#xff0c;获取收益&#xff1b;投资人投资标的必须满足以下条件&#xff1a; 充值过程与绑定过程一致&#xff0c;也是在平台发…

Delphi 11.2 Alexandria程序集代码

Delphi 11.2 Alexandria程序集代码 高DPI VCL设计器-VCL设计器现在在设计时使用类似Microsoft Windows的样式&#xff0c;这意味着除非禁用此功能&#xff0c;否则设计器中的控件始终使用此样式绘制。此样式与Windows当前使用的浅色或深色主题相匹配。 编辑器选项卡-在版本11.2…

【3D目标检测】Frustum PointNets for 3D Object Detection from RGB-D Data

目录概述细节网络结构视锥候选框3D实例分割边界框参数回归损失函数概述 首先本文是基于图像和点云的&#xff0c;属于早期的模态融合的成果&#xff0c;是串行的算法&#xff0c;而非并行的&#xff0c;更多的是考虑如何根据图像和点云这两个模态的数据进行3D目标检测。 提出动…

亚马逊平台不给力?来Starday,告诉你什么是真正的高阶玩法

距2021年的亚马逊封号潮已经过去了一段时间&#xff0c;但其影响却依然在跨境电商行业间回荡。从4月份起&#xff0c;亚马逊就开始对违反平台规则的卖家进行封号。此后打击规模持续扩大&#xff0c;到6月中下旬&#xff0c;深圳一批头部卖家均被亚马逊平台下架&#xff0c;遭到…

Coverage-based Greybox Fuzzing as Markov Chain

AFLFast: Coverage-based Greybox Fuzzing as Markov Chain 一、论文阅读 论文来自CCS2016 作者&#xff1a;Marcel Bhme 模糊测试领域巨佬 Abstract 基于覆盖的灰盒模糊测试 Coverage-based Greybox Fuzzing (CGF)。大多数测试用例执行少数高频路径&#xff0c;制定策略倾…

浪潮信息工程师:谈一谈设备透传虚拟机启动慢背后的原因及其优化方法 | 第 51 期

本周「龙蜥大讲堂」预告来啦&#xff01;龙蜥社区邀请了浪潮信息操作系统研发工程师崔士伟分享《设备透传虚拟机的快速启动优化》&#xff0c;快来扫码入群&#xff0c;预定前排小板凳观看直播吧&#xff01; 直播主题及内容介绍 直播主题&#xff1a;设备透传虚拟机的快速启…

360+城市空气质量指数-日度数据、良好天数统计(2001-2022年)

360城市空气质量指数-日度数据、良好天数统计&#xff08;2001-2022年&#xff09; 城市空气质量指数-日度数据、良好天数统计 1、包括&#xff1a;360个城市 2、时间&#xff1a;2001.1-2022.1月 3、样本量&#xff1a;1371937条 4、数据来源&#xff1a;空气质量在线…

使用Excel 表示汽车、摩托车10年免检时间、非常清晰。

1&#xff0c;汽车摩托车10年内年检问题 根据最新的国家法律&#xff1a; http://www.wenjiang.gov.cn/wjzzw/c152333/2022-09/30/content_66efe4febb8040758f3f079cf0baa310.shtml 搜索了下&#xff0c;找到了成都的规定&#xff1a; 近日&#xff0c;公安部、市场监管总局…

中电海康-中电52所面经

中电海康&#xff0c;中电52所面经中电海康面经一面&#xff08;电话面&#xff09;二面&#xff08;现场面&#xff09;自我回顾中电海康面经 一面&#xff08;电话面&#xff09; Redis的使用和配置多线程的使用&#xff0c;线程池的使用SpringBoot的核心注解和流程AOP IOC …

java项目-第133期ssm物流服务管理平台系统-java毕业设计

java项目-第133期ssm物流服务管理平台系统-毕业设计 【源码请到资源专栏下载】 今天分享的项目是《物流服务管理平台系统》 该项目分为前台和后台。主要分成三个角色&#xff1a;游客、普通管理员、管理员三个角色。 游客就是用户&#xff0c;只要是访问系统前台的用户都可以算…