什么是共享内存呢?

共享内存是被多个进程共享一部分物理内存,共享内存是进程间共享数据最快的办法,因为一个进程向共享内存中写了数据,那么共享的这个区域的所有进程就可以立刻看到这里的数据。

共享内存有什么特点呢?

共享内存被创建以后,一直存在于内核中,直到被删除或者系统关闭,并且读取后,内容仍在其共享内存中。

第一部分,共享内存的创建

我们可以使用shmget来创建一个共享内存。函数原型如下:

我们来通过一个例子来了解下这个函数:

编译并运行,在终端输入命令ipcs -m,可以看见我们创建的共享内存,返回值为共享内存IPC的ID号。因为我们使用的是IPC_PRIVATE,所以共享内存的key都是0。

上图中,nattch表示连接数目,dest表示共享内存段已经被删除了,但是还有程序在连接他。这个key值还可以用ftok函数来创建,如果我们使用IPC_PRIVATE这个参数,我们的key都是0,这样我可以进行有亲缘关系的进程通信,如果我们使用ftok函数来创建,可以进行没有亲缘的进程之间的通信:

第二部分,共享内存的映射

我们在用shmget函数在内核创建一个对象,即开辟一个缓存。 为了方便我们对共享内存进行读写操作,我们需要把我们开辟的缓存映射到用户空间去。我们可以使用shmat函数:

第三部分,共享内存的删除

因为我们的共享内存有个特点,共享内存被创建以后,一直存在于内核中,直到被删除或者系统关闭,并且读取后内容仍在其共享内存中,如果想删除共享内存,我们可以使用shmctl和shmdt。

shmdt函数将我们映射的地址删除,删除的是我们映射在用户空间的地址。函数原型如下:

如果想删除内核中的对象,我们可以使用shmctl删除共享内存对象。函数原型如下:

第四部分,共享内存实例

程序目的:实现父子进程间的通信

程序思路

为了复习一下上一期的内容,我们在实例中加上信号通信,信号通信有疑惑的地方大家可以看上一期文章呢,因为不确定父子进程是谁先运行的,所以我们在父进程中延迟一会,保证子进程先运行,这样我们父进程发信号给子进程就不会导致子进程停止,父进程往共享内存里面写完数据后,发信号给子进程,子进程收到信号后开始读共享内存里面的数据。子进程读完数据以后,删除掉进程和内核里面的共享内存。

编译并运行:

总结:

和信号通信一样,只要我们明确了共享内存创建,映射,删除这个流程,共享内存的知识点很容易就掌握了。

删除共享内存_进程通信专题之 共享内存相关推荐

  1. Linux c 基于内存的进程通信—共享内存、共享队列(消息队列)

    基于内存的进程通信: 1.      内核共享内存 编程模型:     1.1.创建共享内存,得到一个ID  shmget 1.2.把ID影射成虚拟地址(挂载)  shmat 1.3.使用虚拟地址访问 ...

  2. java共享内存_Java进程通信之映像文件共享内存

    Java进程通信之映像文件共享内存 1. 共享内存 vs 进程通信 对UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种.但windows实际上只有影像文件共享内存一种. 而说到进程通信 ...

  3. linux使用共享内存进行进程通信

    一.什么是共享内存 共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常为同一段物理内存.使用共享内存进 ...

  4. linux 进程原理内存,linux进程通信之共享内存原理(基于linux 1.2.13)

    1 有一个全局的结构体数据,每次需要一块共享的内存时(shmget),从里面取一个结构体,记录相关的信息. struct shmid_ds { // 权限相关 struct ipc_perm shm_ ...

  5. python slice是共享内存吗_python共享内存实现进程通信

    1.概述 共享内存可以说是最有用的进程间通信方式.两个不同的进程共享内存的意思是:同一块物理内存被映射到两个进程的各自的进程地址空间.一个进程可以及时看到另一个进程对共享内存的更新,反之亦然.采用共享 ...

  6. Linux编程(10)_进程通信

    1 进程通信相关概念 1 什么是IPC 进程间通信, InterProcess Communication 2 进程间通信常用几种方式 管道 (使用最简单) 信号 (开销最小) 共享内存/映射区 (无 ...

  7. linux 共享内存_什么是物理/虚拟/共享内存——Linux内存管理小结一

    物理内存和虚拟内存到底有什么区别? 提到内存,我们会想到经常接触的三个词:虚拟内存.物理内存.共享内存.它们分别对应top输出中的VIRT.RES.SHR三列. 1. 物理内存 系统的物理内存被划分为 ...

  8. 怎么把虚拟机清空内存_深入理解java虚拟机1——内存管理机制与回收机制

    文中涉及JVM底层知识大多来自<深入理解Java虚拟机>第2版,内容枯燥乏味,如果看,认真看.跟着撸一遍也可以受益良多. 1.JVM:是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...

  9. python变量存储 堆与栈内存内存_浅析JS中的堆内存与栈内存

    最近跟着组里的大佬面试碰到这么一个问题, Q:说说var.let.const的区别 A:balabalabalabla... Q:const定义的值能改么? A:你逗我?不能吧 不知道各位看官怎么想? ...

最新文章

  1. linux下如何查看系统和内核版本
  2. 安装zeromq以及zeromq的python示例
  3. redis主从配置 从而实现数据备份和读写分离
  4. EasyPR--开发详解(8)文字定位
  5. 委托的Invoke 和 BeginInvoke 与Control的Invoke和BeginInvoke(转-因为写得很好)
  6. 一致 Hash 算法
  7. 软键盘弹起,导致底部被顶上去
  8. React开发(210):react中try...catch..
  9. 大屏难看怎么办?这份大屏制作教程请收好
  10. wordpress插件-WP Rocket3.8.8与Rocket3.9.1双版本/火箭缓存插件免授权汉化版
  11. HDFS的NameNode内存解析
  12. link标签的几个用法,帮助提高页面性能
  13. 股市像脱缰的“野牛”,谁是最好的“牛崽”?
  14. stc 串口收发 c语言,STC15W408AS串口通讯PC乱码
  15. Android Merged manifest 错误
  16. 大学四年我是如何学习程序设计的
  17. 使用gmediarender-resurrect搭建DLNA音箱
  18. {大学快毕业的程序员,现在开始写博客}
  19. opencv 修改图像像素
  20. 招银网络科技2019年春招笔试面试总结

热门文章

  1. webso员ket php,客戶端和PHP後端通信:Sokets,Stream,TCP/UDP?
  2. 不等待输入_明明显示“对方正在输入”却总等不来回复,其实是你误解了
  3. java servlet 返回404_java项目访问servlet出现404
  4. 访谈编码怎么做_怎么才能让口才得到提升
  5. linux 统计目录大小并按大小排序
  6. 计算机组成原理双端口存储器实验,计算机组成原理双端口存储器实验报告.doc...
  7. c++ 操作oracle 最佳方式_oracle备份恢复基础详解
  8. (王道408考研数据结构)第六章图-第二节1:图的存储结构(邻接矩阵、邻接表、十字链表和邻接多重表)
  9. 3-5:类与对象中篇——默认成员函数之运算符重载
  10. 27. 二叉树的镜像