mmap 文件不能为空

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

mmap 讲过的人太多了。写这篇的目的,是为了记录今天使用过程中遇到的一个问题:

当映射内存大小大于文件大小时,将导致映射内存无法读写,程序报段错误;

说三遍:文件不能为空!文件不能为空! 文件不能为空!

先说一下解决方案:

​ 打开文件后,调用ftruncate() ,将已打开的文件截断到需要的内存大小即可;

​ 官方推荐:echo 20 > /proc/sys/vm/nr_hugepages;配置20个巨页;配合flags参数使用*//明天试试*

https://man7.org/linux/man-pages/man2/mmap.2.html

看官方文档最靠谱。虽然文档里没说文件不能为空 或者我看漏了

结合百度翻译,简单翻一下,哈哈!

描述

mmap 建立一个到调用继承的虚拟地址空间的映射。addr指定虚拟地址空间的起始地址,length指定映射空间长度(必须大于0);

如果addr 赋NULL,内核选一个页对齐的空闲虚拟空间地址作为起始地址,这是最合适的了;“最好就是传NULL”

如果addr不是NULL, 会以他为基准,找一个页对齐的地址。所以赋值也白赋;

你传的addr甚至可能不是空闲虚拟地址,剩下的还是内核做主;

有名mmap的起始地址由offset这个参数决定,决定从文件offset位置开始映射;还应该是页对齐;

mmap 返回后,文件描述符就可以立马关了, 毕竟mmap可能会增加内核中文件的应用计数;

prot 描述对这块内存期望的权限,w/r/x

flags 决定了公开性,对内存的改变是否对其他使用这个文件mmap的进程可见,不难理解,如果private,可能会单独给这个进程拷贝一份内存;简单点说要进程间共享 就配置MAP_SHARED ;

flags 还有很多其他的属性:

MAP_HUGETLB:这个就是进行巨页映射;可以尽量解决映射长度超出文件长度的问题

MAP_ANONYMOUS :匿名mmap 没有依赖文件,fd=-1,其缓存长度应该直接与length进行页对齐;

个人分(cai)析(ce)放最后:

  1. 空文件,内核也没有分配缓存页,返回的只是进程虚拟空间一段空闲空间的起始地址,并没有实现地址映射;
  2. 映射长度超出文件长度页对齐地址时,也会出现同样的问题;

mmap 文件不能为空相关推荐

  1. Android mmap 文件映射到内存介绍

    本文链接: Android mmap 文件映射到内存介绍 Android开发中,我们可能需要记录一些文件.例如记录log文件.如果使用流来写文件,频繁操作文件io可能会引起性能问题. 为了降低写文件的 ...

  2. Linux下创建硬链接,文件访问为空,提示:xxxx: 符号连接的层数过多

    Linux下创建软链接|硬链接,文件访问为空,提示:x x x: 符号连接的层数过多. 原因:创建符号链接的时候未使用绝对路径,无论是源文件路径还是目标路径,都需要使用绝对路径. 如: ln -s / ...

  3. python3 readline,Python3:readlines 或者 enumerate 是否会导致文件流为空

    python3 环境 代码如下: file_path = os.getcwd() + "/test.txt" project_file = open(file_path," ...

  4. project下查看那些文件夹是空的

    git不能追踪空文件夹.我们在空文件夹下添加readme.txt文件来解决.有时候我们不知道project下到底有那些文件夹是空的.使用 find -type d -empty 就能列出来.

  5. linux判断文件是否为空,linux shell编程 如何判断一个文件是否为空

    最近在写一个小的shell程序,遇到这个问题,在diff -q 两个文件时,如果文件不相同就输出到result文件中,若相同则无输出,即result文件为空,但如何判断result文件是否为空并继续下 ...

  6. win10系统适配器选项网络连接文件夹为空解决办法

    描述: win10系统适配器选项网络连接文件夹为空解决办法 步骤: 点击左下角win图标->Windows系统->命令提示符->右键更多以管理员身份运行命令提示符 输入命令:nets ...

  7. 使用XMind打开.mmap文件不显示问题

    1.问题如下: 使用XMind直接打开.mmap文件时,不显示: 2.解决方式: 1.选择XMind左上方的'文件',然后选择'导入': 2.在弹出如下图页面选择Mindjet MindManager ...

  8. Python操作FTP服务器实现文件和文件夹的上传与下载,python清理ftp目录下的所有文件和非空文件夹

    Python 连接 FTP 服务器并实现文件夹上传实例演示 第一章:连接 FTP 服务器并实现文件夹上传 ① 连接 FTP 服务器 ② 区分文件和文件夹名 ③ 文件夹名包含空格处理 ④ 使用递归实现: ...

  9. Win11系统启动文件夹是空的怎么解决?

    Win11系统启动文件夹是空的怎么解决?有用户发现自己系统的启动文件夹里面没有任何的文件,这样可能会导致我们的电脑出现问题,导致无法正常的启动桌面程序.那么如何去解决这个问题,一起看看具体的解决方法分 ...

  10. webpack打包后的文件夹是空的_深入理解 Webpack 打包分块(下)

    前言 随着前端代码需要处理的业务越来越繁重,我们不得不面临的一个问题是前端的代码体积也变得越来越庞大.这造成无论是在调式还是在上线时都需要花长时间等待编译完成,并且用户也不得不花额外的时间和带宽下载更 ...

最新文章

  1. 汇总下几个IP计算/转换的shell小脚本-转
  2. openblas 矩阵算法库 简介
  3. 学习ASP.NET一定要学习ASP.NET AJAX吗?
  4. C++实现快速排序算法QuickSort()
  5. linux 烧写(1)
  6. server sql 水平分表_springboot集成Shardingsphere进行分库分表
  7. 【kafka】Timeout of 60000ms expired before the position for partition could be determined
  8. 打游戏时领悟了“向死而生”,这个AI算法真的不虚强化学习
  9. ZeroC IceBox介绍及demo构建
  10. 【设计模式】迭代器模式
  11. 油猴脚本插件 千图网无水印原图素材
  12. TLPI UNIX linux系统编程手册源代码运行
  13. react等 一些视频学习网址
  14. 游戏玩家的程序猿之路
  15. 动态jenkins slave
  16. anaconda初体验
  17. Python合并两个列表,使两个列表拼接起来
  18. 那些改变过世界的代码都是怎么写的?
  19. c语言编写简易打飞机游戏
  20. 免费获取百度网盘会员一天或七天的不限速网盘会员

热门文章

  1. 使Fiddler4抓包微信小程序
  2. mysql安装包下载与检核
  3. wifi密码本 字典(免费)
  4. mysql省市区递归查询_mysql递归查询
  5. 计算机网络技术知识点
  6. vue项目中使用cn打印组件
  7. 【日期工具类】DateUtils
  8. 软件测试肖sir__简历模板制作
  9. 计算机课怎么管纪律,浅谈如何巧妙设置学生机轻松管理机房课堂纪律
  10. 电源大师课笔记 3.3