(1)文件存储映射I/O(Memory-mapped I/O)

一个磁盘文件与存储空间中的一个缓存区相对应,这样可以在不适合read/write函数的情况下,使用地址(指针)完成I/O操作。具体实现通过内核指定一个文件映射到存储区域中,这个映射可以通过mmap来实现。

mmap函数原型及头文件

函数参数:addr:建立映射区的首地址,由linux内核决定,直接赋值NULL即可;

length:想要建议映射区的大小(应该比磁盘文件小)

prot:映射区权限,有PROT_READ,PROT_WRITE,PROT_READ|PROT_WRITE(权限小于文件的权限)

flags:标志位参数,通常用来设置更新物理区域,设置共享,创建匿名映射区

                                       MAP_SHARED:映射区所做的操作会反应到磁盘上

MAP_PRIVATE:映射区所做的操作会不反应到磁盘上

fd:磁盘文件的文件描述符

offset:映射文件的偏移(4K整数倍,因为内存的最小大小是4K)

返回参数:成功,返回映射区首地址;失败:返回MAP_FAILED宏(一定要检查再使用)

与mmap相对的,有一个函数munmap用来回收mmap申请的映射空间

函数原型及头文件: 成功返回0,失败返回-1.

mmap和munmap函数使用时注意事项:

(2)mmap父子间进程通信

父子间等有血缘关系的进程可以通过mmap来建立映射,只需要改变创建映射区的标志位参数flags.

MAP_SHARED(共享映射)  父子进程共享映射区

MAP_PRIVATE(私有映射)  父子间各自独占映射区

实现父子进程通信,父进程穿件映射区,然后fork子进程,修改映射区的内容,父进程再读取映射区内容,检查是否修改。

父子进程共享:打开的文件和mmap建立的映射区(MAP_SHARED)

(3)匿名映射

父子进程间通信建立一个映射区通常需要打开一个文件,创建好再unlink(删除文件的临时目录项,以便在所有使用这个文件的进程关闭后删除文件),close等操作,比较麻烦,可以采用匿名映射来代替临时文件,具体操作如下:

mmap(NULL.size(任意大小),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);

MAP_ANONYMOUS(MAP_ANON)宏是linux操作系统所特有的宏。

在类unix系统中可以使用以下操作完成匿名映射区的建立。

fd=open("/dev/zero",O_RDWR);

p=mmap(NULL,size,PROT_READ|PROT_WRITE,MMAP_SHARED,fd,0);

(4)mmap无血源关系实现进程间通信

mmap是内核借助文件创建一个映射区,多个进程可以通过利用该映射区来完成数据传递,因此无血缘关系的进程也可以进行通信,只需要设置对应的flags即可(设置成MAP_SHARED)

实现非血源关系的进程间的通信,一个进程实现写映射区操作,一个实现读映射区操作(先完成写进程操作,再完成读进程操作)。

写进程操作:

读进程操作

linux操作系统进程间通信IPC之共享存储映射相关推荐

  1. Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)

    共享存储映射 文件进程间通信 使用文件也可以完成 IPC,理论依据是,fork 后,父子进程共享文件描述符.也就共享打开的文件. 编程:父子进程共享打开的文件.借助文件进行进程间通信. 测试代码 /* ...

  2. linux操作系统进程间通信IPC之管道pipe及FIFO

    linux环境下,各进程相互独立,如果想要交换两个进程之间的数据,需要通过内核,在内存中提供一个缓存区,一个进程往缓存区中写数据,一个往缓存区读数据,内核提供的这种机制称为进程间通信(IPC),常见的 ...

  3. 【Linux进程间通信】四、mmap共享存储映射

    欢迎加入[Linux C/C++/Python社区]一起探讨和分享Linux C/C++/Python/Shell编程.机器人技术.机器学习.机器视觉.嵌入式AI相关领域的知识和技术. mmap共享存 ...

  4. Linux下IPC方式之共享存储映射(mmap)

    Linux下IPC方式之共享存储映射(mmap) 1. 共享存储映射(mmap) 2. mmap九问 3. mmap实现父子进程通信 4. 匿名映射 5. mmap实现无血缘进程通信 1. 共享存储映 ...

  5. Linux进程+进程间通信IPC

    一 Linux进程 1) 进程的内存映像 2)解释 BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Bloc ...

  6. Linux系统搭建NFS网络共享存储

    Linux系统搭建NFS网络共享存储 一.NFS概述: NFS是一种基于TCP/IP传输的网络文件系统协议,最初由SUN公司开发.通过NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源 ...

  7. 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap

    IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...

  8. linux:进程间通信 IPC

    文章目录 1.管道 1.1.匿名管道 1.2.有名管道 2.信号 3.共享内存 3.1.共享内存接口 3.1.1.生成 key 值 3.1.2.创建共享内存 3.1.3.创建共享内存映射 3.1.4. ...

  9. 【Linux】进程间通信--systemV标准--共享内存

    文章目录 systemV 标准 共享内存通信原理 共享内存的理解 共享内存的创建--shmget函数 查看共享内存和释放共享内存方式 挂在共享内存--shmat函数 去挂在共享内存--shmdt函数 ...

最新文章

  1. 设置状态栏和标题栏的样式
  2. 如何在 Asp.Net Core 中 管理敏感数据
  3. high definition audio感叹号_【网抑云文案】你知道红色感叹号吧,我对着它聊了184天。...
  4. 华三ap设置无线服务器,H3C无线控制器实现Remote AP功能典型配置举例(V7)
  5. 回文字符串,回文链表
  6. Vivado2018的使用
  7. mtk刷机/启动流程学习笔记
  8. 框架设计--第二章 Spring中的Bean--习题答案
  9. scratch好书推荐
  10. Linux 》编译器gcc/g++,调试器gdb
  11. WTL自绘界面库(CQsButton)
  12. 转发:上海软件公司排行 (估计是2008年的吧)
  13. 2022.1.9 力扣-周赛-统计追加字母可以获得的单词数
  14. 随机森林算法: 实战基于随机森林的医疗费用分析与建模预
  15. skynet设计原理和使用
  16. Spring框架中的单例Beans是线程安全的么
  17. SAP中财务账期和物料账期系统内表
  18. 软件测试周刊(第71期):大悲时不发言,大怒时不争辩,大喜时不许诺。
  19. Python批量下载无版权图片
  20. 阿里云服务器vgn6i配置NVIDIA CUDA+cuDNN

热门文章

  1. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)
  2. TCP握手为什么需要三次通信
  3. 织梦其他模型使用联动类型地区联动
  4. 为别人软件加入广告或者密码(特别思路)
  5. 《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---10
  6. ADO.NET_09_Using 关键字
  7. php送数据找不到表,php – 数据源默认值中找不到的模型表
  8. mysql 二叉树表设计_mysql---B+tree索引的设计原理
  9. 计算机科学计算方面分为,计算机方面的专业分为哪些类?【资讯与计算科学】和【电脑科学与技术专业】有什么不同?...
  10. Linux将硬盘转化为pv,Linux扩展硬盘 物理卷(PV) 卷组(VG) 逻辑卷(LV)