mmap函数

#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

参数:

  • void *addr建立映射区的首地址,由Linux内核指定,所以我们直接传递NULL。也就是说虽然这是一个参宿但是并不需要我们传递,当建立好映射区以后映射区的首地址将以返回值返回。
  • size_t length建立映射区的大小,一般由创建映射区的文件的大小
  • int prot用来表示映射区的权限(读,写,读写,执行,对于执行一般是操作系统调用)。PROT_READ PORT_WRITE PROT_READ | PROT_WRITE
  • int flags标志位参数,可以通过设置标志位来决定对映射区的修改是否反应到磁盘上。
    • MAP_SHEARD会将映射区所做的修改反映到物理设备上
    • MAP_PRIVATE映射区所做的修改不会反映到物理设备
  • int fd用来建立映射区的文件描述符
  • off_t offset映射文件的偏移,用于截取文件的一部分建立映射区(4K的整数倍)
    返回值:
    成功返回创建映射区的首地址。失败返回MAP_FAILED

ftruncate用来扩展文件大小
关闭映射区:

int munmap(void *addr, size_t length);

第一个参数必须是映射区的首地址,长度可以变化
成功返回0,失败返回-1

例如:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<string.h>int main()
{int fd = open("mmap1file",O_CREAT | O_RDWR | O_TRUNC ,0644);if(-1 == fd){perror("open error");exit(1);}if(-1 == ftruncate(fd, 128))   {perror("ftruncate error:");exit(1);}char *p = mmap(NULL, lseek(fd,0,SEEK_END), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if(MAP_FAILED == p){perror("mmap error:");exit(1);}strcpy(p,"Hello mmap!");close(fd); //关闭文件if(-1 == munmap(p,128)){perror("munmap error:");exit(1);}return 0;
}

注意事项

  • 可以用malloc创建大小为0 的堆空间,并且可以free, 不可以创建大小为0 的映射区
  • 如果文件是以只读方式打开的就不能改变文件大小
  • 如果文件是以只读方式打开,那么不能将映射区设置为MAP_SHARED,但是可以将映射区设置为MAP_PRIVATE
  • 如果文件以只写方式打开,将无法建立映射区,错误信息为Permission denied,因为创建映射区的过程中其实有一次隐含的读操作
  • 创建映射区的权限要小于等与文件的权限
  • 偏移量必须是页(4K)的整数倍
  • 因为mmap容易出错,所以一定要保留mmap的返回值,并通过perror输出错误信息
  • 关闭映射区的时候munmap的第一个参数必须是映射区的首地址
  • 建立映射区以后文件即使关闭也不影响,如果是MAP_SHARED的话仍旧会修改磁盘文件

利用共享内存在父子进程之间通信

用于通信的时候我们创建一个临时文件,成功创建映射区以后将文件关闭不再使用。

具体的方法是:

  1. 创建一个文件
  2. 使用ftruncate函数改变文件大小
  3. 使用unlink函数删除目录项(创建临时文件)
  4. 建立映射区
  5. 关闭文件

在父子进程间通信时MAP_SHARED指的是共享同一个映射区,MAP_PRIVATE指的是不共享映射区,父子进程分别占用

匿名映射

因为正常mmap函数必须依赖一个文件,虽然这个文件没有存在的必要,因此我们需要openftruncateunlinkclose比较麻烦。因此我们可以使用匿名映射较为方便地创建映射区。

int *p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

len可以根据我们的需要修改大小。
MAP_ANONYMOUS表示匿名通信,可以简写为MAP_ANON

需要注意的是MAP_ANONYMOUS只能够在Linux系统中使用,在其他类Unix系统中不可以使用,在其他系统中使用字符设备文件/dev/zero

int fd = open("/dev/zero", O_RDWR);
p = (int*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

mmap无血缘关系进程通信

同一个文件创建的是一个映射区,因此如果我们想要在没有血缘关系,就需要通过同一个文件来建立映射区

strace 可执行文件追踪程序里面所使用的系统调用有哪些

其实Linux系统对文件的操作是通过mmap进行的

Linux系统【五】进程间通信-共享内存mmap相关推荐

  1. Linux系统编程—进程间通信—共享内存

    Linux共享内存 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察觉 ...

  2. Linux基础入门--进程间通信--共享内存

    Linux基础入门--进程间通信--共享内存 1.共享内存IPC原理 2.共享内存管理 1.共享内存IPC原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,共享内存是在内存单独开辟的一段内 ...

  3. c++ fork 进程时 共享内存_linux共享内存mmap

    Linux进程间通信-共享内存mmap 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的 ...

  4. Linux环境进程间通信(五): 共享内存(上)

    Linux环境进程间通信(五): 共享内存(上) 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间. ...

  5. 好文转载 Linux环境进程间通信(五): 共享内存(上)

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写 ...

  6. Linux进程间通信:共享内存mmap、xsi和posix

    前言 本文主要说明在Linux环境上如何使用共享内存.阅读本文可以帮你解决以下问题: 什么是共享内存和为什么要有共享内存? 如何使用mmap进行共享内存? 如何使用XSI共享内存? 如何使用POSIX ...

  7. Linux下进程间通信--共享内存:最快的进程间通信方式

    内存共享最新整理: Linux下进程间通信-共享内存 - 码到城攻共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式https://www.codecomeon.com/posts/109/ ...

  8. 【Linux】Linux进程间通信——共享内存/消息队列/守护进程

    文章目录 进程间通信--共享内存/守护进程 一, 共享内存 1. 共享内存概念 2. 共享内存使用 1. 共享内存使用步骤 2. 共享内存操作函数 3. 共享内存常用操作命令 4. 共享内存使用示例: ...

  9. linux篇【9】:进程间通信(共享内存)——<后序>

    目录 一.system V共享内存--先让不同的进程看到同一份资源 1.共享内存原理 监控共享内存脚本 2.创建/获取 共享内存接口-shmget函数(shared memory get) 3.参数k ...

最新文章

  1. 如何同时安装Office2003和Office2007!
  2. HTML 30分钟入门教程
  3. spring boot示例_Spring Boot完成示例
  4. java java 检查型异常_如何整合Java中的有效性检查和异常抛出?
  5. 快手上市首日涨近161% 两大创始人身家破千亿
  6. 第二部分:开发简要指南-第六章 使用Fragments构建动态UI
  7. eNSP中AC用Web方式登录
  8. 吴恩达机器学习【第六天】神经网络模型
  9. Docker下ETCD集群搭建
  10. 一文搞懂前端对象的深拷贝与浅拷贝
  11. 英雄联盟一直连接服务器win10,win10上玩英雄联盟无法连接服务器是怎么回事
  12. 如何使用PS修改图片中的数字
  13. 用英语说计算机的优点1000,我的英语老师作文1000字
  14. 我的世界java村民繁殖_教程/村民养殖 - Minecraft Wiki,最详细的官方我的世界百科...
  15. C 合成的图片文件的小练习
  16. Java JNA (三)—— 结构体使用及简单示例
  17. Infrared的危害-激光和红外区别
  18. 软件开发Share the Cakes
  19. lammps案例:团簇融化过程模拟案例学习
  20. 音乐相册源码php,基于PHP的DIY音乐相册网站的设计与实现(MySQL)(含录像)

热门文章

  1. Jenkins 入门系列--jenkins 介绍
  2. EMF的一些总结(2)——关于EMF的序列化
  3. 计算机c语言二级题型,计算机二级C语言题型和评分标准
  4. 导出mysql excel数据字典_mysql导出 Excel数据字典(全)
  5. 网络html代码是什么问题,html代码问题
  6. batchplot插件用法_Batchplot批量打印怎么用?Batchplot批量打印教程
  7. java 线程“生产/消费”模型1
  8. 力扣删除排序数组中的重复项
  9. 开启linux ssh
  10. 嵌入式指针embedded pointer的概念以及用法