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

管道与共享内存

一,命名管道

管道的限制就是他只能在有血缘关系(父子进程)的进程中,允许互相访问,这是有局限性的,所以我们想在毫无关系的进程中允许他们相互访问,这就是命名管道的定义。
总结:命名管道就是让不同进程可以通信,让不同的进程看到同一份资源
在这里插入图片描述
就比如这个图,通过管道让两个进程看到同一个资源,然后执行不同的任务,进程A就进行向文件中读取数据,而进程B就是向文件中写入数据。

两个不同的进程打开同一份文件时,他们需要自己独立的文件描述符,但是只需要相同的一份缓冲区这也是管道。

创建命名管道

在这里插入图片描述

二,共享内存

共享内存也是让毫无关系的进程进行通信(不同的进程看到同一份资源);

1.创建共享内存

在这里插入图片描述
对于OS来说可能有很多的程序需要内存共享,所以要先描述在组织,shm结构体包含了共享内存的属性。

系统中有很多的共享内存如何保证两个进程看到的是同一个内存呢?
给共享内存提供唯一性的标识,共享内存的属性中有key_t值。

shmget的第三个参数shmflg两个重要的宏

  1. IPC_CREAT:如果共享内存不存在就创建,如果已经存在就获取他
  2. :不能单独使用
  3. IPC_CREAT|IPC_EXCL:不存在就创建,存在就出错返回!

key的作用就用来标识贡献内存的唯一性!

1.1生成key

在这里插入图片描述

使用共享内存通信,只需要一个进程创建新得shm,另一个直接通信即可。
在这里插入图片描述
贡献内存,进程结束我们没有主动关闭,他就会一直存在,他的生命周期随内核,所以我们要手动的去关闭它

补充:系统指令删除共享内存

ipcs -m

查看系统中指定用户创建得共享内存
在这里插入图片描述

ipcrm -m [shmid]

删除共享内存
在这里插入图片描述

2.删除共享内存

在这里插入图片描述
另外shmctl不仅仅可以删除共享内存,它还可以获取共享内存的属性。
在这里插入图片描述

3.挂接共享内存

在这里插入图片描述
shmaddr:用户指明讲共享内存挂接到哪里;
挂接成功表示:我们可以用addr返回值,直接访问共享内存。

4.去关联

在这里插入图片描述

三,共享内存的缺点

我们在测试的时候就会发现一个问题,当client都没有在向共享内存中写入数据,server就一直在读取了:共享内存不提供任何进程间协同的机制。这是共享内存的缺点,会导致数据不一致。所以加入管道就可以避免这一缺点。


http://www.kler.cn/news/363837.html

相关文章:

  • JS补原型链
  • 【Blender】 学习笔记(一)
  • 梳理一下spring中,与message相关的知识点
  • 正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 5427(unattended-upgr)持有
  • 关于写查询接口的一些理解
  • 21、基于Firefly-rk3399字符设备驱动寄存器控制LED
  • 【Go语言】语法基础之变量、数据类型详解
  • perl双引号内字符串的反斜线转义
  • 【Linux系统】Linux系统习题整理
  • zsh: command not found: nvm 问题(Mac)
  • 得物iOS函数调用栈及符号化调优实践|得物技术
  • 【前端布局 如何适配不同分辨率 vue2】
  • 12、论文阅读:利用生成对抗网络实现无监督深度图像增强
  • 【Java】多线程-线程创建的两种方式【主线学习笔记】
  • 在vue中key的原理是什么,有什么作用
  • 《Vue.js 组件开发秘籍:从基础到高级》
  • CTFHUB技能树之文件上传——无验证
  • sql-labs靶场第十六关测试报告
  • 一款精美的导航引导页html源码
  • STM32 从0开始系统学习 1
  • 从0开始深度学习(20)——延后初始化和自定义层
  • Text实现美团部分样式
  • 代码随想录刷题学习日记
  • 基础知识 main函数形参 C语言
  • C++:模板的特化与分离编译
  • Python re 模块:正则表达式的强大工具