Linux 进程间通信——消息队列

一、消息队列的原理

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立接收含有不同类型值得数据库。

在这里插入图片描述
消息实际上是一个数据块,这个数据块是一个结构体,结构体由自己命名。消息的第一个成员是固定的,它是一个长整型,它代表消息的类型,后面的成员是自己定义的数据。一开始消息队列是空的,可以由一个进程a向消息队列中发送消息,但是如果由另外一个进程b或c去接收消息队列中的消息就会发生阻塞。当一个进程往消息队列中发送消息时,只要这个消息队列没有满,就可以添加进去,如果消息队列满了,就会发生阻塞。当一个进程去接收消息队列中的消息时可以指定消息的类型,当消息队列中没有所指定的消息的类型,进程就会发生阻塞。

1.消息队列与有名管道

消息队列和有名管道有许多相似之处

相同点:

使用消息队列并没有解决我们在使用有名管道时遇到的一些问题,比如管道满时的阻塞问题,在消息队列中同样存在,消息队列满时也会发生阻塞。

不同点:

消息队列相比较管道来说,消息队列少了在打开和关闭管道方面的复杂性。消息队列提供了一种在两个不相关的进程之间传递数据的相当简单且有效的方法。与有名管道相比,消息队列独立于发送和接收进程而存在,这消除了在同步有名管道的打开和关闭时会产生的一些困难。

2.消息队列得优缺点:

(1)优点:

①可以通过发送消息来几乎完全避免有名管道得同步和阻塞问题。

②可以用一些方法来提前查看紧急消息。

缺点:

与管道一样,每个数据块都有一个最大长度得限制,系统中所有队列所包含得全部数据块得总长度也有一个上限。Linux系统有两个宏定义MSGMAX和MSGMNB,它们以字节为单位分别定义了一条消息的最大长度和一个队列的最大长度。其它系统中这些宏定义可能会不一样或者不存在。

3.消息队列的生命周期

消息队列的生命周期并不随进程的结束而结束,是随内核持续的。调用消息队列相关的内核的接口,内核帮忙创建,只要自己不主动去删除,就会一直存在,即便进程已经结束,它们也一直会在内核中被维护着。想用的时候还可以继续用,在程序最后不使用的情况下把它删除。删除的方法有3种,关机、调用相关函数删除和在命令行手动删除。

信号量、共享内存的生命周期也是如此。

二、消息队列相关接口函数

1.msgget() 创建消息队列

创建或者获取一个消息队列的ID

 int msgget(key_t key, int msqflg);   

参数解释:
key:“房间密码”
msqflg:创建消息队列的方式,同时设置权限
返回值:成功返回消息队列id,失败返回 -1

权限的设置规则:

IPC_CREAT:可以单独使用,如果消息队列不存在,则重新开辟,函数返回值是新开辟的消息队列的ID;如果已经存在,则沿用已有的消息队列,函数返回值是已有的消息队列的ID。

IPC_EXCL:无法单独使用,要配合IPC_CREAT使用,即 IPC_CREAT | IPC_EXCL,表示如果消息队列不存在,则重新开辟,函数返回值是新开辟的消息队列ID;如果已经存在,则报错。

IPC_CREAT | IPC_EXCL | 0664:开辟消息队列的同时,设置消息队列的访问权限

2.msgsnd() 向消息队列中添加一条消息

该函数的作用是向消息队列中添加一条消息。

int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg);

参数解释:

msgid:消息队列ID,即msgget函数的返回值
msgp: 消息缓冲区的地址,也就是你要向消息队列中添加的消息,需要满足一定的格式。消息格式如下:

  struct msgbuf  
{  long  mtype;   // 消息类型, 必须大于0  char  mtext[1]; //  消息数据  //(结构体的最后一个成员是数组,该数组也被称为柔性数组,即数组大小可变)
};  

msgsz:指定mtext中有效数据的长度。这里的消息长度指的是上面这个结构体中buf成员所占字节数。
msgflag:表示发送消息的方式。一般设置为0。也可以设置IPC_NOWAIT。可选值及其含义如下:

在这里插入图片描述
返回值:成功返回0,失败返回-1

3.msgrcv())接收一条消息

该函数的作用是从消息队列的队头取出一条消息。

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

参数解释:

msgid:消息队列id
msgp:输出型参数,表示消息缓冲区的地址。也就是你要把取出来的消息放在哪,同样需要使用指定格式。数据格式和msgsnd函数所要添加的消息的格式一样,如下:

  struct msgbuf  
{  long  mtype;   // 消息类型, 必须大于0  char  mtext[1]; //  消息数据  //(结构体的最后一个成员是数组,该数组也被称为柔性数组,即数组大小可变)
};  

size:用于存放接收到的消息数据的缓冲区大小。
msgtype:选择想要取出的消息类型(虽然叫做消息队列,但是不一定就是取出队头元素,也可以是取出具有相同消息类型中的第一个消息)。主要分为以下三种情况:

在这里插入图片描述

msgtype < 0的具体解释:假设消息队列里的消息类型有 1、3、4、5 四种类型的消息,如果msgtype = -4,绝对值是4,那就需要取出消息类型小于等于4的所有消息,因此,取出消息的消息类型必须是1、3、4类型。

msgflag:表示接收消息的方式。一般设置为0,也可以设置IPC_NOWAIT等,可选值如下:

在这里插入图片描述
返回值: msgrcv()成功返回mtext中接收到的消息数据的长度, 失败返回-1。

4.msgctl()一般用来销毁消息队列

该函数的作用是控制消息队列,一般用来销毁消息队列。

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

参数解释:

msgid:消息队列id
cmd:对消息队列执行的具体操作,如拷贝、查询、销毁等。可选值如下:

在这里插入图片描述

buf:消息队列缓冲区。比如 cmd 为IPC_STAT时,会把消息队列的相关信息拷贝到该缓冲区中。
返回值:msgctl()成功返回0,失败返回-1

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

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

相关文章

HTML笔记(3)

表单标签 用于登录、注册界面&#xff0c;以采集用户输入的信息&#xff0c;把信息采集到之后&#xff0c;用户一点按钮&#xff0c;就会把这些信息发送到服务端&#xff0c;服务端就可以把这些数据存储到数据库&#xff0c;所以表单是一个非常重要的html标签&#xff0c;它主要…

Appium 2安装与使用java对Android进行自动化测试

文章目录 1、Appium 2.1安装1.1、系统要求1.2、安装Appium2.1服务1.3、安装UiAutomator2驱动1.4、安装Android SDK platform tools1.5、下载OpenJDK 2、Android自动代码例子2.1、安装Android自动化测试元素定位工具Appium Inspector2.2、编写android app自动化测试代码和使用ex…

常见架构类型

目录 1.单机架构 2.应用数据分离架构 3.读写分离架构 4.冷热分离架构 5.垂直分库架构 6.微服务架构 7.容器编排架构 1.单机架构 单机架构是简单的将应用服务和数据库服务部署到同一台机器上。 缺点&#xff1a;存在很大的性能限制。 2.应用数据分离架构 引入负载均衡&a…

Git概述

目录 一、什么是Git 二、什么是版本控制系统 三、Git和SVN对比 SVN集中式 SVN优缺点 Git分布式 Git优缺点 四、Git工作流程 四个工作区域 工作流程 五、Git下载与安装 一、什么是Git 很多人都知道&#xff0c;林纳斯托瓦兹在1991年创建了开源的Linux&#xff0c;从…

鲁棒优化入门(5)—Matlab+Yalmip求解鲁棒优化编程实战

之前的博客&#xff1a;鲁棒优化入门&#xff08;二&#xff09;——基于matlabyalmip求解鲁棒优化问题 去年发布了使用Yalmip工具箱求解鲁棒优化问题的博客之后&#xff0c;陆陆续续有朋友问我相关的问题&#xff0c;有人形容从学习这篇博客到求解论文中的鲁棒优化问题&#x…

【云原生】Docker基本原理及镜像管理

目录 一、Docker概述 1.1 IT架构的演进&#xff1a; 1.2 Docker初始 1.3 容器的特点 1.4 Docker容器与虚拟机的区别 1.5 容器在内核中支持2种重要技术 1.6 Docker核心概念 1&#xff09;镜像 2&#xff09;容器 3&#xff09;仓库 二、安装Docker 2.1 Yum安装Docker…

PCTA 认证考试高分通过经验分享

作者&#xff1a; msx-yzu 原文来源&#xff1a; https://tidb.net/blog/0b343c9f 序言 我在2023年8月10日&#xff0c;参加了 PingCAP 认证 TiDB 数据库专员 V6 考试 &#xff0c;并以 90分 的成绩通过考试。 考试总分是100分&#xff0c;超过60分就算通过考试。试卷…

centos 7.9 部署django项目

1、部署框架 主要组件&#xff1a;nginx、uwsgi、django项目 访问页面流程&#xff1a;nginx---》uwsgi---》django---》uwsgi---》nginx 2、部署过程 操作系统&#xff1a;centos 7.9 配置信息&#xff1a;4核4G 50G 内网 eip &#xff1a;10.241.103.216 部署过程&…

小素数,大智慧

小素数&#xff0c;大智慧 定义判断方法方法1方法2方法3方法4方法5方法6方法7 定义 素数&#xff08;质数&#xff09;&#xff1a;在大于 1 的自然数中&#xff0c;只有 1 和该数本身两个因数的数 素数&#xff08;质数&#xff09;&#xff1a;在大于1的自然数中&#xff0c;…

K8S用户管理体系介绍

1 K8S账户体系介绍 在k8s中&#xff0c;有两类用户&#xff0c;service account和user&#xff0c;我们可以通过创建role或clusterrole&#xff0c;再将账户和role或clusterrole进行绑定来给账号赋予权限&#xff0c;实现权限控制&#xff0c;两类账户的作用如下。 server acc…

ListNode相关

目录 2. 链表相关题目 2.1 合并两个有序链表&#xff08;简单&#xff09;&#xff1a;递归 2.2 删除排序链表中的重复元素&#xff08;简单&#xff09;&#xff1a;一次遍历 2.3 两链表相加&#xff08;中等&#xff09;&#xff1a;递归 2.4 删除链表倒数第N个节点&…

ARM--day4(电灯实验、分析RCC、GPIO控制器,PMOS管、NMOS管的基本原理)

电灯实验代码&#xff1a; .text .global _start _start: /**********LED1点灯**************/RCC_INIT:1.使能GPIOE组控制器&#xff0c;通过RCC_AHB4ENSETR寄存器设置第&#xff3b;5:4&#xff3d;位写&#xff11;---->0x50000A28[4]1ldr r0,0x50000A28ldr r1,[r0]orr…

京东门详一码多端探索与实践 | 京东云技术团队

本文主要讲述京东门详业务在支撑过程中遇到的困境&#xff0c;面对问题我们在效率提升、质量保障等方向的探索和实践&#xff0c;在此将实践过程中问题解决的思路和方案与大家一起分享&#xff0c;也希望能给大家带来一些新的启发 一、背景 1.1、京东门详介绍 1.1.1、京东门…

【MySQL】索引

本期我们好好唠唠索引 目录 一、索引的概念 二、索引的重要性 三、对于索引的理解 3.1 MySQL与磁盘交互的基本单位page 3.2 MySQL中的数据交互过程 3.3 索引建立的过程 3.3.1 page的存储形式 3.3.2 B树的形成 3.4 为什么不用其他数据结构来建立索引 四、聚簇索引和非…

Python tkinter Notebook标签添加关闭按钮元素,及左侧添加存储状态提示图标案例,类似Notepad++页面

效果图展示 粉色框是当前页面&#xff0c;橙色框是鼠标经过&#xff0c;红色框是按下按钮&#xff0c;灰色按钮是其他页面的效果&#xff1b; 存储标识可以用来识别页面是否存储&#xff1a;例如当前页面已经保存用蓝色&#xff0c;未保存用红色&#xff0c;其他页面已经保存用…

【力扣】42. 接雨水 <模拟、双指针、单调栈>

【力扣】42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 目录 【力扣】42. 接雨水题解暴力双指针单调栈 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…

数据结构<树和二叉树>顺序表存储二叉树实现堆排

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

c语言实现MD5算法

MD5加密 文章目录 MD5加密MD5介绍应用场景代码分析 &#xff08;基于qt5.14.2&#xff09;测试记录 MD5介绍 1。 一种单向加密算法&#xff0c;即对明文加密&#xff0c;而不能通过密文得到明文。对原数据的任何改动&#xff0c;哪怕是1字节&#xff0c;得到的MD5值都有很大的区…

vue路由及打包部署

vue路由&#xff08;前端路由&#xff09;&#xff1a;URL中的hash&#xff08;#号&#xff09;与组件之间的对应关系。 一、安装vue路由 npm install vue-router3.5.1 二、定义路由表 路由表主要记录hash&#xff08;#号&#xff09;与组件之间的对应关系。主要定义在route…

FPGA:uart原理+tx发送模块+rx接收模块

文章目录 一、串口通信二、UART通信三、tx发送模块四、rx模块接收 一、串口通信 处理器与外部设备通信的两种方式&#xff1a; 串行通信&#xff1a; 指数据的各个位使用多条数据线同时进行传输。 并行通信&#xff1a; 将数据分成一位一位的形式在一条数据线上逐个传输。 串…