【Linux】进程间通信——消息队列和信号量

目录

消息队列(message queue)

信号量(Semaphore)


system V版本的进程间通信方式有三种:共享内存,消息队列和信号量。之前我们已经说了共享内存,那么我们来看一下消息队列和信号量以及它们之间都属于一个版本,所以不管是接口还是底层实现都有很多的相似性,我们也一同来探讨一下。

消息队列(message queue)

所谓的消息队列就是在内核中维护着一个队列,进程A和进程B之间要进行通信就把自己要发送的信息放到这个队列中,为了区分是哪个进程发的,信息要有类型,其实就是用一个标记位标记一下。用简单的图来表示就是这样:

那么下面我们就来介绍一下它的接口

man msgget用来创建消息队列

我们可以看到它的参数和shmget 的参数是一样的,所以key也是由ftok生成,msgflg也是传选项IPC_CREAT和IPC_EXCL,这和共享内存是一样的。

man msgctl用来控制消息队列,包括删除

这个函数也是跟shmctl是完全一样的,第二个参数就是选项,第三个参数也是内核暴露给我们的信息:

这个跟共享内存也是完全一样的,都是这样的结构

下一个接口就是进程像消息队列发送和接收消息的接口

msgsnd msgrcv

这里的msgp就是要传OS给我们提供的一个结构体类型创建的对象

信号量(Semaphore)

首先,我们需要知道几个名词并明白它们的意义,

互斥:就是在访问一部分共享资源的时候,任何时候都只有我一人访问,就叫做互斥

同步:就是访问资源在安全的前提下,具有一定的顺序性

被保护起来的,任何时刻只能有一个进程访问的叫临界资源

访问临界资源的代码,叫做临界区,当然了这个之外的就叫做非临界区

原子性:操作对象的时候只有两种状态,要么还没开始,要么已经结束

其实信号量本质就是一个计数器,描述临界资源数量的这样一个计数器,用来控制访问该资源的进程数量。

当我们申请资源的时候这个计数器就会--,当释放资源的时候这个计数器就会++,前者也被称为P操作,后者也被称为V操作。

那么下面我们就来认识一些信号量的接口

man semget

第二个参数是你想创建几个信号量,就是几个计数器,所以这个函数返回的是信号量集标识符

man semctl

信号量的内核暴露给我们的信息跟消息队列和共享内存几乎一样的

man semop进行PV操作

第二个参数就是我们通过这个结构体传要进行什么操作

我们可以看到,system V版本的三种进程间通信的方式它们的相似之处还是有很多的,就比如:它们的有关信息的结构体:shmid_ds,msgid_ds,semid_ds,它们三个结构中第一个成员都是ipc_perm,于是我们就可以用一个数组把三种方式管理起来,数组中存放ipc_perm的指针,ipc_perm结构体中存着它是哪一种通信方式。这样只要知道了ipc_perm的指针以及是那种通信方式,我们就可以获取到这种通信方式的信息。

通过这样的方式,就把三种进程间通信方式管理到了同一个数组中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式Linux】<总览> 网络编程(更新中)

文章目录 前言 一、网络知识概述 1. 网路结构分层 2. socket 3. IP地址 4. 端口号 5. 字节序 二、网络编程常用API 1. socket函数 2. bind函数 3. listen函数 4. accept函数 5. connect函数 6. read和recv函数 7. write和send函数 三、TCP编程 1. TCP介绍 2.…

新版本WPS不登录无法编辑的解决办法

原因分析:新版本的WPS因加入多种在线功能,建议登录账号获得更加体验 解决办法:首选第一种修改注册表后重启WPS,第二种仅作为临时满足工作需求,过一段时间会自动失效 方法一:键盘同时按下WINR键,…

【Python】基础语法(函数、列表和元组、字典、文件)

。一、函数 1、函数是什么 编程中的函数和数学中的函数有一定的相似之处。 数学上的函数,比如 y sin x,x 取不同的值,y 就会得到不同的结果。 编程中的函数是一段可以被重复使用的代码片段。 (1)求数列的和&…

MySQL索引特性(上)

目录 索引的重要 案例 认识磁盘 MySQL与存储 先来研究一下磁盘 扇区 定位扇区 结论 磁盘随机访问与连续访问 MySQL与磁盘交互基本单位 建立共识 索引的理解 建立测试表 插入多条记录 局部性原理 所有的MySQL的操作(增删查改)全部都是在MySQL当中的内存中进行的&am…

网友提问:HTML CSS JS很低级吗?

这话听起来就像有人在说披萨只是面团加奶酪,完全忽略了上面的美味配料和烘烤的艺术啊!HTML、CSS、JS这三位可是前端开发的铁三角,它们一点都不“低级”,反而相当关键。 HTML就像是房子的骨架,没有它,网页就…

【iOS】——MRC

一、引用计数 内存管理的核心是引用计数器,用一个整数来表示对象被引用的次数,系统需要根据引用计数器来判断对象是否需要被回收。 在每次 RunLoop 迭代结束后,都会检查对象的引用计数器,如果引用计数器等于 0,则说明…

单链表算法 - 链表分割

链表分割_牛客题霸_牛客网现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的。题目来自【牛客题霸】https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70思路: 代码: /* struct ListNode {int val;struct List…

烧掉一个亿就为造好一把椅子,西昊如何策划人体工学椅极致产品力

2011年到2015年这4年期间,功能单一,价值雷同的椅子市场趋于饱和,竞争的白热化和同质化带来了全行业的价格战,彼时西昊的经营陷入巨大的困境,所有的产品和钱都变成成库存,现金流几乎枯竭。因此,西…

文心一言《使用手册》,文心一言怎么用?

一、认识文心一言 (一)什么是文心一言 文心一言是百度研发的 人工智能大语言模型产品,能够通过上一句话,预测生成下一段话。 任何人都可以通过输入【指令】和文心一言进行对话互动、提出问题或要求,让文心一言高效地…

智能家居产品公司网站源码,自适应布局设计,带完整演示数据

适合各类智能家居电子产品使用的网站源码,深色大气设计,自适应布局设计,pc手机均可完美适配,带完整演示数据。 独家原创资源。源码是asp开发的,数据库是access,主流的虚拟主机空间都支持asp,直…

<Rust><GUI>rust语言GUI库tauri体验:前、后端结合创建一个窗口并修改其样式

前言 本文是rust语言下的GUI库:tauri来创建一个窗口的简单演示,主要说明一下,使用tauri这个库如何创建GUI以及如何添加部件、如何编写逻辑、如何修改风格等,所以,这也是一个专栏,将包括tauri库的多个方面。…

面对人工智能发展的伦理挑战:应对策略与未来方向

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

硬件开发笔记(二十六):AD21导入电感原理图库、封装库和3D模型

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140437290 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

SAP ERP与金蝶云星空的集成案例(新能源光伏行业)

一、项目环境 阳光新能源开发股份有限公司(简称“阳光电源”)是一家专注于新能源开发利用的国家高新技术企业。作为阳光电源(股票代码:300274)旗下的新能源开发投资平台,阳光新能源聚焦光伏、风电、风光…

暴雨让服务器不怕热҈热҈热҈热҈

在AI算力呈几何倍数增长的趋势下,算力逐渐朝着“高性能、高密度、高耗能“发展。在高耗能的算力下,AI服务器功率已逐步逼近风冷散热极限,而液冷作为更加高效、低能耗的制冷技术,逐渐成为了高密度算力散热场景的首选方案。 液冷的…

数据结构-java中链表的存储原理及使用方式

目录 链表(线性表的链式存储) 代码实例:(链表构建,头插尾插) LinkedList LinkedList的使用: 1、构造方法 2、操作方法 LinkedList 和 ArrayList 的区别 链表(线性表的链式存储…

Minio搭建文件服务器的学习

MinIO是一个高性能的开源对象存储服务器,与Amazon S3兼容。它使用Go语言编写,可以在多种操作系统上运行,如Linux、MacOS和Windows等。MinIO的分布式特性使其能够轻松扩展存储容量和处理能力,满足大规模数据存储的需求。 使用Docke…

你也想做一个Element-ui吧!!!——Blueの前端路(一)

目录 前言: 父子组件 button组件 使用vue脚手架初始化一个项目 如何封装,注册和使用一个组件 main.js中将组件设置为全局 使用 此组件我们所需实现的内容 type 父组件组件传递type属性 子组件接收负组件传递的数据 通过绑定类名的方法动态控制…

北汽蓝谷:预期能否兑现

天天提热搜,公司却一路亏损,股价却一路走高,今天说说——北汽蓝谷 问最近车圈谁最热,北汽蓝谷少不了。先是享界S9上市定档,华为余承东“在线带货”。 后有百度无人驾驶萝卜快跑引发全网热议,所用车型便来自…

TF/SD卡开发驱动(SPI)

TF与SD卡本质上来说都是flash类型的存储器 可以理解为TF卡是SD卡的升级版,体积小功能强大,SD卡是传统意义上的存储卡,适用范围比较广,而SD卡的驱动方式有两种 SDIO 和 SPI,同理TF卡也是一样 (在资源足够…