目录

基本概念

相关系统调用

使用内存映射进程通信:(是非阻塞通信。)

父子进程通过内存映射通信;

内存映射注意事项

匿名映射


基本概念

将磁盘文件映射到内存,用户修改内存就可以直接修改磁盘文件。(修改内存快很多,改磁盘很慢)。


相关系统调用

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

映射长length(非0)的磁盘文件到addr(nullptr则自动选择一个)。
            stat lseek可以获取文件长度(当小于分页大小,会至少指定一个分页大小)
            prot:对申请的内存映射区的操作权限。 PROT_EXEC  PROT_WRITE PROT_READ  PROT_NONE       要操作,必须有读的权限
            flags:MAP_SHARED 映射区数据会自动和磁盘文件同步,进程通信必须设置
                     MAP_PRIVATE 不同步,映射区修改后,创建一个新文件
            fd:open()得到的映射文件的fd,大小不能为0. open指定权限与prot不能冲突

offset:偏移量,必须是4k的整数倍,一般不偏移,置0.、

成功返回创建的内存的首地址 失败返回MAP_FAILED   (void*) -1;

int munmap(void *addr, size_t length); 释放内存映射 数值同上。


使用内存映射进程通信:(是非阻塞通信。)

1 有关系的进程: 先映射,再fork()  父子进程共享创建的内存映射区

2 没有关系:准备一个大小非0的磁盘文件,

进程1以此创建内存映射区,得到操作该内存的指针,

进程2也以此创建内存映射区,得到操作该内存的指针,  两个以此通信。

父子进程通过内存映射通信;

#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{ int ret=open("test.txt",O_RDWR);int size=lseek(ret,0,SEEK_END);//内存映射void* ptr=mmap(nullptr,size,PROT_READ|PROT_WRITE,MAP_SHARED,ret,0);if(ptr==MAP_FAILED){perror("mmap:");exit(0);}pid_t pid=fork();if(pid>0){//父进程wait(NULL);char buf[64];strcpy(buf,(char*)ptr);std::cout<<"parent read: "<<buf<<" "<<getpid()<<std::endl;}else if(pid==0){//子进程strcpy((char*)ptr,"today is a good day");}std::cout<<"i am here "<<getpid()<<"\n";munmap(ptr,size);
}

内存映射注意事项

1 mmap返回的ptr,可以++,但是++后munmap(ptr,len)会发生错误。 所以++前要先保存一份。

open指定权限与prot不能冲突,MAP_FAILED

3 文件偏移量必须是4k整数倍,否则返回MAP_FAILED

磁盘文件大小非0

5 open时可以O_CREAT创建新文件,但为了文件大小非0,需要对其扩展,lseek/ftruncate。

  int ret=open("lseek.txt",O_CREAT|O_RDWR,0664);lseek(ret,20,SEEK_END);char *wrbuf= "hjhk";write(ret,wrbuf,strlen(wrbuf));    扩展并写入文件大小才能生效
或者//ftruncate(ret,20);//truncate("lseek.txt",20)

6 mmap后关闭fd,对mmap无影响。

7 void*ptr=mmap()   ptr越界操作的时非法内存,会产生段错误(当程序试图访问不允许访问内存位置,或试图以不允许的方式访问内存位置(例如尝试写入只读位置,或覆盖部分操作系统)时会发生段错误)。

8 可以用来实现文件复制。旧文件和要复制的文件分别映射后, memcpy(ptr1,ptr,len)进行内存复制。

匿名映射

不需要文件实体进行内存映射。可用于父子进程通信。 flag设置MAP_ANONYMOUS   fd=-1;

 void* ptr=mmap(nullptr,4096,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);

进程间通信:内存映射相关推荐

  1. 进程间通信(IPC)之内存映射mmap和共享内存shm

    一.共享内存shm 1 概念:多个进程的地址空间都映射到同一块物理内存,这样多个进程都能看到这块物理内存,实现进程间通信,而且不需要数据的拷贝,所以速度最快. 二.内存映射mmap 1 前言:先介绍一 ...

  2. 内存映射文件的方式进行进程间通信

    项目中有个场景,vb.net需要调用C++处理后的图片. 原来的处理方案是,C++处理图片后,保存图片到磁盘上,VB.NET再从磁盘上进行读取. 现在想对这个方案进行优化.内存映射文件的形式进行进程间 ...

  3. 内存映射文件实现进程间通信

    原理介绍 在Windows平台中,常见的进程间通信机制包括管道.socket.WM_COPYDATA.邮槽等,这些在同一台机器上实现共享数据的最底层机制就是内存映射文件,如果要求低开销和高性能,内存映 ...

  4. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  5. 用内存映射文件实现进程间通信

    使用内存映射文件的一般流程: 由于内存映射文件的一致性,即系统保证在同一文件映射对象的多个视图间保持一致.这可以作为进程通讯的基础,而且在Windows上,同一台机器上共享数据的最底层机制都是内存映射 ...

  6. Linux IPC实践(8) --共享内存/内存映射

    概述 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图). 共享内存 VS ...

  7. 文件内存映射mmap解决大文件快速读写问题和进程间共享内存

    mmap函数主要用途有三个: 1.将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能: 2.将特殊文件进行匿名内存映射,可以为关联进程提供共 ...

  8. linux mmap 内存映射

    http://www.perfgeeks.com/?p=723 mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap ...

  9. mmap 内存映射详解

    目录 mmap基础概念 mmap内存映射原理 mmap示例代码 mmap和常规文件操作的区别 mmap使用的细节 前言 原文对 mmap 内存映射已经表述的很清楚了,我只是在原文的基础上,附上了 mm ...

最新文章

  1. 求解单源最短路径的几种算法
  2. HBASE+Solr实现详单查询--转
  3. unity mysql生成cexcel_【C#附源码】数据库文档生成工具支持(Excel+Html)
  4. Linux压缩那些事
  5. 时间序列预测 时间因果建模_时间序列建模以预测投资基金的回报
  6. 开源Blog系统-欧式风格家具网站源码v1.5.4
  7. 施工日志管理软件app_启用ERP装修管理软件的必要性
  8. 图解Linux字符设备驱动
  9. 使用Rufus制作系统启动盘
  10. PS小知识(一)——建立不透明度:蒙版
  11. 2022-2027年中国星级酒店市场竞争态势及行业投资前景预测报告
  12. 阳历时间转换为农历时间
  13. 微信ipad协议简述
  14. 触摸屏 触摸操作 鼠标点击事件
  15. 史上最全面、最详细的Cookie总结
  16. input输入框输满3个字符自动跳到下一个input输入框
  17. SAS中常见的数组函数
  18. Linux上安装编译lzo报错:Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run 已解决
  19. 计算机毕业设计ssm动漫交流与推荐分析系统633g7系统+程序+源码+lw+远程部署
  20. python单词翻译-python 中英文翻译

热门文章

  1. c语言那些编译器支持c11,有什么完美支持C11标准的IDE吗?
  2. 云顶之弈手游什么服务器语言是中文,《云顶之弈手游》怎么设置中文 设置中文教程攻略...
  3. 《图论及其应用》学习笔记(有向图)
  4. 【电气专业知识问答】问:电力变压器的不正常工作状态和可能发生的故障有哪些?一般应装设哪些保护?
  5. HDR对人眼的模拟介绍
  6. Halcon学习---光学字符训练、识别(OCR)算子
  7. 【读书笔记】《waht is mathematic》第一章补充——数论
  8. 内嵌播放器JCVideoPlayer
  9. MySQL执行引擎对比与SQL优化
  10. virtual box安装ms-dos6.22