【Linux】进程间通信——system V版本 共享内存

目录

共享内存

原理

实践

shmget() 创建共享内存

shmctl()   删除共享内存

shmat()   挂接进程和共享内存

shmt()     进程和共享内存去关联

共享内存的特性

优势

劣势

用共享内存实现进程间通信


共享内存

原理

两个进程的PCB各自维护着一个进程地址空间。当两个进程要进行通信时:

  1.  操作系统在内存中开辟一个内存块。
  2. 通过两个进程的页表,将内存中的内存块映射到两个进程的进程地址空间中。
  3. 此时两个进程就能看到同一个内存了,也就建立了通信。
  4. 进行通信时,两个进程只需要访问自己的进程地址空间即可,操作系统会通过页表访问内存中的内存块。

实践

shmget() 创建共享内存

  • 功能

        在内存中创建共享内存

  • 参数:    
    • key_t key 用来确定共享内存的唯一标识(系统中有很多共享内存,如何确定进程A和进程B通信的共享内存是同一个呢?通过key来确定)
    • size_t size  创建共享内存的大小
    • int shmflg  共享内存的权限,包括下面两种:

              1、 IPC_CREAT  不存在创建,存在获取

               2、IPC_EXCL   无法单独使用,必须与其他标志组合使用

   IPC_CREAT | IPC_EXCL:创建共享内存,如果不存在,则创建,如果存在,错误返回。

  • 返回值

        创建成功返回共享内存的标识,失败返回-1。

如何获取key?

  • 功能

        创建独一无二的key值

  • 参数

        1、pathname: 文件的路径,可以随便填写,建议当前路径"./"

        2、proj_id:项目的id,可以随便填写

  • 返回值

        返回一个key值

shmctl()   删除共享内存

当我们在进程通信时使用shmget创建了共享内存,但是当进程结束之后,共享内存并没有消失。

共享内存的生命周期是随内核的,用户不主动关闭,就一直存在。

可以使用  ipcs -m  指令查看共享内存.

如何删除共享内存?  两种方式:

1、手动输入命令  ipcrm -m shmid 删除

2、在程序中使用函数 shmctl()删除

  • 功能

        删除指定shmid的共享内存

  • 参数

1、shmid   要删除的共享内存的id,是shmget的返回值

2、cmd      删除的命令,常用的是IPC_RMID,也有时候用IPC_STAT

3、buf        描述共享内存的数据结构的指针,一般设置为nullptr

  • 返回值

        成功返回 0, 失败返回 -1

shmat()   挂接进程和共享内存

  • 功能

        使两个进程挂接到同一个共享内存上

  • 参数

1、shmid        创建共享内存后返回的标识符,shmget的返回值

2、shmaddr    指定共享内存映射到进程地址空间中的地址,一般设置成NULL,让系统自动来设置。

3、shmflg        权限,可以设置为0

  • 返回值

        共享内存映射到进程地址空间中的地址(shmaddr),不成功返回-1

shmt()     进程和共享内存去关联

  • 功能

        将进程和共享内存去关联

  • 参数

        shmaddr  指定共享内存映射到进程地址空间中的地址,shmat的返回值

  • 返回值        

        返回挂接进程个数

共享内存的特性

优势

当使用管道进行进程间通信的时候,需要拷贝4次。

键盘->写入端进程地址空间->管道->写出端进程地址空间->显示器

使用共享内存进行进程间通信的时候,需要拷贝两次

键盘->共享内存(写入写出端进程地址空间)->显示器

所以,共享内存是进程间通信最快的!

劣势

共享内存通信方式没有同步互斥机制,容易导致混乱。

用共享内存实现进程间通信

实现进程间通信,需要两个进程,一个做客户端,一个做服务端

运行结果:

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

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

相关文章

Linux的学习之路:8、Linux调试器-gdb使用

摘要 本章主要是说一下gdb的使用,以及把使用指令放入放个指令手册。 目录 摘要 一、背景 二、使用 1、产生debug文件 2、进入gdb 3、使用指令 三、思维导图 一、背景 Linux调试器gdb的背景主要涉及到Linux程序发布方式和调试需求。 在Linux中&#xff0c…

SpringBoot学习笔记二

SpringBoot学习笔记二 1.SpringBoot配置加载顺序1.1 内部配置加载顺序1.2 外部配置加载顺序 2. SpringBoot整合其他框架2.1 SpringBoot整合Test2.2 SpringBoot整合Redis 1.SpringBoot配置加载顺序 1.1 内部配置加载顺序 同理可知,父项目中的confg下的配置优先级最…

Impala Catalogd启动报错NoClassDefFoundError: org.apache.hadoop.fs.FileSystem

开端 今天在部署Impala时遇到一个NoClassDefFoundError的错误,本以为只是CLASSPATH的小问题,没想到调查了一天…… 事情是这样的,编译Impala生成RPM,部署到另一台机器上后,statestored能正常启动,catalog…

二分法查找左右边界(含代码模板)

问题1:使用mid left(right-left)/2 或者 mid (leftright)/2,两者计算结果相同吗? 在大多数情况下是等价的。 mid left (right - left) / 2:先计算了区间长度,然后再除以2。 这种方式可以避免整数溢出问题,因为它…

探索Java中的栈:Stack与Deque(ArrayDeque和LinkedList)

文章目录 1. 栈(Stack)1.1 定义方式1.2 特点1.3 栈的层次结构 2. 双端队列(Deque)2.1 定义方式及继承关系2.2 特点:2.3 ArrayDeque2.4 LinkedList2.5 Deque 的各种方法2.6 如何选择ArrayDeque和LinkedList 3. 如何选择…

冶炼金属(蓝桥杯)

文章目录 冶炼金属题目描述二分查找难点解释 冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V个普通金属 O 恰好可以冶炼出一个特殊金属 X&#xff…

【稳定检索|投稿优惠】2024年生物学与智能计算国际会议 (ICBIC 2024)

2024年生物学与智能计算国际会议 (ICBIC 2024) 2024 International Conference on Biology and Intelligent Computing 【会议简介】 2024年生物学与智能计算国际会议即将在上海召开。本次会议旨在汇聚生物学与智能计算领域的专家学者,共同探讨两者交叉融合的前沿…

【Linux】网络基础(一)

文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层(或四层)模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…

【webrtc】源码下载与编译

目录 下载 下依赖 内存需求 !! 参考文章 : 下载 (1) windows ,centos上都会报错 (2) ubuntu A : 在git上设置代理 B fetch通过 ubuntu的界面 proxy设置了代理 这将会拉取webRTC源码,且额外加了a…

ssm043基于JavaEE的龙腾公司员工信息管理系统的设计与实现+jsp

龙腾公司员工信息管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本龙腾公司员工信息管理系统就是在这样的大环境下诞生,其可…

C++数据结构与算法——动态规划打家劫舍系列

C第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更…

千视电子携NDI 6前沿技术,亮相北京CCBN展呈现轻量化媒体解决方案

千视携NDI 6技术闪耀2024 CCBN展会,呈现轻量化媒体解决方案 2024年4月24日至26日,北京首钢会展中心将举办第三十届中国国际广播电视网络技术展览会(CCBN2024)。这是中国广播电视行业的一项重要盛会,将有国内外超600家…

kubectl_入门_Pod配置以及生命周期

Pod配置以及生命周期 1. Pod结构定义 每个pod中都可以包含一个或多个容器,这些容器可以分为两类 用户程序所在的容器,数量可多可少Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个 可以以它为根据,评估整个…

异地两分部子网重复,如何远程更改其中一个分部子网信息

环境: 分部1:子网192.168.1.0/24 分部2:子网192.168.1.0/24 问题描述: 异地两分部子网重复,如何远程更改其中一个分部子网,原本没有问题目前要与总部建ipsec提示冲突无法都建立隧道 解决方案: 先G一下,看看有啥建议 在两个异地分部网络中,如果发现有子网地址出现…

java 解析 xml 字符串转换为实体,实体转换为 xml 字符串

java 解析 xml 字符串转换为实体,实体转换为 xml 字符串 1. XmlCommonUtil工具类代码如下: import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller;/*** XmlCommonUtil类用于XML字符串和对象之间…

从零开始,如何成功进入IT行业?

0基础如何进入IT行业? 简介:对于没有任何相关背景知识的人来说,如何才能成功进入IT行业?是否有一些特定的方法或技巧可以帮助他们实现这一目标? 在当今数字化时代,IT行业无疑是一个充满活力和机遇的领域。…

Linux服务器疑似被入侵

随着开源产品的越来越盛行,作为一个Linux运维工程师,能够清晰地鉴别异常机器是否已经被入侵了显得至关重要,个人结合自己的工作经历,整理了几种常见的机器被黑情况供参考。 背景信息:以下情况是在CentOS 6.9的系统中…

Leetcode 56. 合并区间和Leetcode 240. 搜索二维矩阵 II

文章目录 Leetcode 56. 合并区间题目描述C语言题解和思路解题思路 Leetcode 240. 搜索二维矩阵 II题目描述C语言题解和思路解题思路 Leetcode 56. 合并区间 题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合…

mac上如何安装python3

mac上如何安装python3? 安装homebrew 在终端执行命令 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 执行完成后,homebrew和pip等工具就自动安装好了。 接下来安装python3.在终端…

C++生成随机数游戏

// 添加随机种子&#xff0c;作用&#xff1a;利用当前系统时间生成随机数&#xff0c;防止每次随机数都一样 srand((unsigned int)time(NULL)); #include <stdio.h> #include <windows.h> #include <iostream> #include <ctime> using namespace std;…