mmap使用注意事项

思考:
1. 可以 open 的时候 O_CREAT 一个新文件来创建映射区吗 ?
2. 如果 open O_RDONLY mmap PROT 参数指定 PROT_READ|PROT_WRITE 会怎样?
3. 文件描述符先关闭,对 mmap 映射有没有影响?
4. 如果文件偏移量为 1000 会怎样?
5. mem 越界操作会怎样?
6. 如果 mem++ munmap 可否成功?
7. mmap 什么情况下会调用失败?
8. 如果不检测 mmap 的返回值,会怎样?
总结:
1. 创建映射区的过程中,隐含着一次对映射文件的读操作。
2. MAP_SHARED 时,要求:映射区的权限应 <= 文件打开的权限 ( 出于对映射区的保护 ) 。而 MAP_PRIVATE 则无所谓,因为 mmap 中的权限是对内存的限制。
3. 映射区的释放与文件关闭无关。只要映射建立成功,文件可以立即关闭。
4. 特别注意,当映射文件大小为 0 时,不能创建映射区。所以:用于映射的文件必须要有实际大小!! mmap 使用时常常会出现总线错误,通常是由于共享文件存储空间大小引起的。如, 400 字节大小的文件,
在建立映射区时 offset 4096 字节,则会报出总线错。
5. munmap 传入的地址一定是 mmap 的返回地址。坚决杜绝指针 ++ 操作。
6. 如果文件偏移量必须为 4K 的整数倍
7. mmap 创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。
注意事项:
1.用于创建映射区的文件大小为0,实际指定非o大小创建映射区,出“总线错误”。
2.用于创建映射区的文件大小为0,实际制定o大小创建映射区,出“无效参数”。
3.用于创建映射区的文件读写属性为,只读。映射区属性为读、写。出“无效参数”
4创建映射区,需要read权限。当访问权限指定为“共享”MAP_SHARED时,mmap的读写权限应该〈=文件的open权限。只写不行。
5.文件描述符fd,在map创建映射区完成即可关闭I后续访问文件,用地址访问。
6. offset 必须是4096的整数倍。(MMU映射的最小单位4 )
7.对申请的映射区内存,不能越界访问。
8. munmap用于释放的地址,必须是mmap申请返回的地址。
9.映射区访问权限为“私有”MAP_PRIVATE,对内存所做的所有修改,只在内存有效,不会反应到物理磁盘上。
10.映射区访问权限为“私有”MAP_PRIVATE,只需要open文件时,有读权限,用于创建映射区即可。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值