使用 mmap 时务必注意以下事项:
1.创建映射区的过程中,隐含着一次对映射文件的读操作。
2. 当 MAP_SHARED 时,要求:映射区的权限应 <= 文件打开的权限(出于对映射区的保护)。而 MAP_PRIVATE 则无所谓,因为 mmap 中的权限是对内存的限制。
3. 映射区的释放与文件关闭无关。只要映射建立成功,文件可以立即关闭。
4. 特别注意,当映射文件大小为 0 时,不能创建映射区。所以:用于映射的文件必须要有实际大小!! mmap 使用时常常会出现总线错误,通常是由于共享文件存储空间大小引起的。如,400 字节大小的文件, 在建立映射区时 offset 4096 字节,则会报出总线错。
5. munmap 传入的地址一定是 mmap 的返回地址。坚决杜绝指针++操作。
6. 如果文件偏移量必须为 4K 的整数倍
7. mmap 创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。

#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <string.h>
int main()
{int fd= open("test.txt",O_CREAT | O_TRUNC | O_RDWR,0664);if(fd==-1){perror("open failed!");}int ret=ftruncate(fd,4096);//截断文件大小if(ret==-1){perror("truncate failed!");}char* ptr=nullptr;ptr=(char*)mmap(NULL,20,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);if(ptr==MAP_FAILED){perror("mmap failed!");return 0;}close(fd);//mmap建立的是虚拟地址到磁盘地址的映射,并不需要使用文件句柄strcpy(ptr,"ABCD");//写操作munmap(ptr,20);//释放映射的虚拟地址空间
}

mmap相关函数
函数原型

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

返回说明

成功执行时,mmap()返回被映射区的指针。失败时,mmap()返回MAP_FAILED[其值为(void *)-1],error被设为以下的某个值:

返回错误类型

参数

start:映射区的开始地址

length:映射区的长度

prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起

prot

flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体

flag

fd:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为-1

offset:被映射对象内容的起点

相关函数

int munmap( void * addr, size_t len )

成功执行时,munmap()返回0。失败时,munmap返回-1,error返回标志和mmap一致;

该调用在进程地址空间中解除一个映射关系,addr是调用mmap()时返回的地址,len是映射区的大小;

当映射关系解除后,对原来映射地址的访问将导致段错误发生。

mmap函数使用说明以及示例相关推荐

  1. mmap函数用法及示例程序

    UNIX网络编程第二卷进程间通信对mmap函数进行了说明.该函数主要用途有三个: 1.将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能: ...

  2. fopen()、fwrite()、fread()函数使用说明与示例

    fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )

    文章目录 一.获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 二.从 /proc/pid/maps 文件中获取 指定 进程 中的 /system/l ...

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

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

  5. pandas中align函数的使用示例

    pandas中align函数的使用示例 pandas align函数生成的结果为一个元组 align(),DataFrame与Series或DataFrame之间连接运算,常用的有内联,外联,左联,右 ...

  6. python和R数据类型查看、赋值、列表、for循环、函数用法对比示例

    python和R数据类型查看.赋值.列表.for循环.函数用法对比示例 很多工程师可能刚开始的时候只熟悉python或者R其中的一个进行数据科学相关的任务. 那么如果我们对比这学习可以快速了解语言设计 ...

  7. php怎么输出3个函数和,PHP利用var_dump,var_export,print_r三个函数的区别示例

    感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!下面的示例看看这三个函数的具体的区别,其中var_dump和var_export比较少用,但他们两者又很相似.所以可以看看: 代码如下: /* 5 ...

  8. php特殊函数,PHP常用特殊运算符号和函数的简单示例

    这篇文章主要为大家详细介绍了PHP常用特殊运算符号和函数的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧! 注解符号: // 单行注解 多行注解 ...

  9. 共享内存简介和mmap 函数

    一.共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. 即每个进程地址空间都有一个共享存储器的映射区,当这块区 ...

最新文章

  1. java 循环依赖_java – 如何在Gradle中解决循环依赖
  2. docker搭建redis
  3. oracle 数据文件recover,Oracle数据库意外删除数据文件的恢复(转载)
  4. 【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能
  5. z-wave问题汇总
  6. 全国各高校开学时间汇总!
  7. redis 消息队列 过段时间不能下发_以Redis来谈消息队列
  8. 两个正态总体均值差的置信区间
  9. 阿里云 oss 存储临时Token访问
  10. 10大动图:秒懂各种常用通信协议原理
  11. 音响的灵魂! 世界顶级扬声器品牌介绍
  12. Rasa 3.x 学习系列-Rasa [3.4.0] - 2022-12-14新版本发布
  13. C# SolidWorks 二次开发 API --- 2018版 中文翻译 之官方示例
  14. 机械键盘到底茶轴好还是黑轴好呢?第一次用,需要注意什么?
  15. 计算机网络常见英文缩写词语
  16. 创意下的个性化咖啡体验,Barsetto百胜图咖啡
  17. 英特尔磁盘快速存储技术-Intel RST 修复4t硬盘
  18. 企业数超500万家,钉钉宣布进入软件硬件智能化融合的4.0时代
  19. SPOJ7258 SUBLEX 后缀自动机
  20. 论文翻译——Artificial Intellligence:miracle or mirage?

热门文章

  1. oracle时差,oracle的时差
  2. vivox9怎么和计算机共享,vivo手机怎么分享软件给别人(共享软件的操作步骤)...
  3. 如何选择适合你的兴趣爱好(六十),电子琴
  4. springboot2 配置404、403、500等错误页面自动跳转
  5. 【IoT】物联网之 WIFI 一键配网 smartConfig 浅析(ESP32)
  6. Android程序员赚够100W,回老家发展,应该可以活得很好吧,移动端开发工程师面试
  7. HCIP第三天(HDLC协议与PPP协议)
  8. 我去。两个字的演变。《人类文字之变》文 / 江湖一剑客
  9. 【转帖】POV LED基于51单片机的旋转LED电子钟
  10. MySQL中的真实案例:某网站有email字段,存储邮件地址,想调查163,126,qq,eyou邮箱的比例;