博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程间通信(共享内存映射区)
阅读量:5281 次
发布时间:2019-06-14

本文共 1138 字,大约阅读时间需要 3 分钟。

函数:mmap()

作用:创建内存映射区,将磁盘上的文件数据映射到内存,用户通过内存就能修改磁盘文件。

优点:效率高

缺点:不阻塞,麻烦(对效率不是很高的要求建议用管道)

函数原型:

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

mmap参数说明:

  • addr:内存映射区的首地址,Linux内核自动指定,传NULL
  • length:映射区大小,不能为0,一般文件长度多大就指定多大(可通过lseek求)
  • prot:映射区权限(PROT_READ、PROT_WRITE)必须要有读权限
  • flags:设置共享或者私有(MAP_SHARED、MAP_PRIVATE)
  • fd:文件描述符,打开的文件需要读取权限
  • offset:映射文件的偏移量,映射的时候文件指针的偏移量(必须是4k的整数倍)一般填0

返回值:成功返回文件内存映射区的首地址,失败返回MAP_FAILED == (void *)(-1)

 

munmap参数说明:

  • addr:mmap返回的内存映射区的首地址
  • length:映射区大小

返回值:成功返回0, 失败返回-1

 

进程间通信:

  有血缘关系的进程间通信:父子进程共享内存映射区(可创建匿名内存映射区)

  无血缘关系的进程间通信:不能通过匿名内存映射方式通信,只能借助磁盘文件通信

  mmap是不阻塞的。

 

如果创建匿名内存映射区:

  • length需要指定内存映射区大小
  • flags参数需要加 MAP_ANON 宏
  • fd参数要改为-1

常见问题:

  1. 如果对的返回值(ptr)做++操作(ptr++), munmap是否能够成功?
    不能,释放了不改释放的内存
  2. 如果open时O_RDONLY, mmap时pro?参数指定 PROT_READ | PROT_WRITE会怎样?
    mmap调用失败,open是的权限必须大于等于mmap时内存映射区的权限
  3. 如果文件偏移量为1000会怎样?
    调用失败,偏移量必须时4k的整数倍
  4. mmap什么情况下会调用失败?
    问题2、3。还有就是length == 0时
  5. 可以open的时候O_CREAT一个新文件来创建映射区吗?
    可以,但是大小不能为0,需要做文件拓展
  6. 如果通过内存映射区写文件超过内存映射区大小会怎样?
    程序不会出错,但是超过内存映射区的部分不会写入文件

 

转载于:https://www.cnblogs.com/SingleJourney/p/9027138.html

你可能感兴趣的文章
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>
最简单的线程同步的例子
查看>>
旅途上看的电影和观后感
查看>>
Ztree异步树加载
查看>>
关于IE和火狐,谷歌,Safari对Html标签Object和Embed的支持问题
查看>>
poj3320 Jessica's Reading Problem(尺取思路+STL)
查看>>
分布式计算开源框架Hadoop介绍
查看>>
安卓平台接口剖析
查看>>
坏的事情不都会带来坏的结果
查看>>
RPC的基础:调研EOS插件http_plugin
查看>>
第二次团队冲刺第二天
查看>>
bzoj 2257 (JSOI 2009) 瓶子与燃料
查看>>
11)Java abstract class 和 interface
查看>>
使用xrdp或Xmanager 远程连接 CentOS6
查看>>
Linux误删恢复
查看>>
Unity调用Windows窗口句柄,选择文件和目录
查看>>
HashMap循环遍历方式
查看>>
React Native 入门 调试项目
查看>>