当前位置: 首页 > news >正文

【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的指针以及是那种通信方式,我们就可以获取到这种通信方式的信息。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【JavaScript脚本宇宙】提升开发效率:选择合适的日期处理工具库
  • actual combat 35 —— es
  • 数据结构——线性表(C语言实现)
  • Jupyter Notebook 使用教程
  • 宠物健康新守护:智能听诊器引领科技突破
  • centos下使用yum安装keepalived工具
  • chrome扩展清除指定站点缓存chrome.browsingData.remove
  • 【Git 学习笔记】第五章 在 Git 仓库存入附加信息(上)
  • redis登录缓存
  • Elasticsearch索引映射定义
  • 【Godot4.2】MLTag类:HTML、XML通用标签类
  • Java学习|JSON 处理库:Gson、FastJson、Jackson的比较与使用指南
  • OSPF注意事项
  • 数据结构第31节 线程安全的数据结构
  • 数据结构之栈的实现与排序详解与示例(C, C#, C++)
  • 10个确保微服务与容器安全的最佳实践
  • Android优雅地处理按钮重复点击
  • js算法-归并排序(merge_sort)
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux中的硬链接与软链接
  • Magento 1.x 中文订单打印乱码
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • php面试题 汇集2
  • webpack+react项目初体验——记录我的webpack环境配置
  • XML已死 ?
  • 包装类对象
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何编写一个可升级的智能合约
  • 手写一个CommonJS打包工具(一)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序 setData 学问多
  • HanLP分词命名实体提取详解
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 职场生活之道:善于团结
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #stm32整理(一)flash读写
  • #VERDI# 关于如何查看FSM状态机的方法
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (rabbitmq的高级特性)消息可靠性
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)Linux——Linux常用指令
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm高校实验室 毕业设计 800008
  • (回溯) LeetCode 46. 全排列
  • (九十四)函数和二维数组
  • (四)linux文件内容查看
  • (一)SvelteKit教程:hello world
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)Linux 多线程条件变量同步
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**