Linux中内存映射区(mmap函数)

mmap函数:

作用:创建一个文件的共享映射区

函数原型: void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);

返回值;

复制代码
 On success, mmap() returns a pointer to the mapped area.  On error, the
       value  MAP_FAILED  (that is, (void *) -1) is returned, and errno is set
       to indicate the cause of the error.

成功返回创建映射区的首地址;

失败返回MAP_FAILED 宏

参数:

  1. addr:指定映射的起始地址,通常设为NULL,由系统指定
  2. length:映射到内存的文件长度(大小)
  3. prot:映射区的保护方式,常用:
  • PROT_READ Pages may be read.
  • PROT_WRITE Pages may be written.
  • PROT_WRITE | PrOT_READ 读写

4.flag:映射区的特性,可以是:

复制代码
 MAP_SHARED
              Share this mapping.  Updates to the mapping are visible to other
              processes  mapping  the  same  region, and (in the case of file-
              backed mappings) are carried through  to  the  underlying  file.
              (To  precisely  control  when updates are carried through to the
              underlying file requires the use of msync(2).)

MAP_SHARED:写入映射区的数据会写入文件,且允许其他映射该文件的进程共享(对映射区的修改可以反映到文件里去,也就是说可以修改文件)

复制代码
       MAP_PRIVATE
              Create a private copy-on-write mapping.  Updates to the  mapping
              are  not  visible  to other processes mapping the same file, and
              are not carried through to the underlying file.  It is  unspeci‐
              fied  whether changes made to the file after the mmap() call are
              visible in the mapped region.

MAP_PRIVATE:对映射区的写入操作会产生一个映射区的复制,对此区域所做的修改不会写入原文件。

5.fd:由open返回的文件描述符,代表要映射的文件。

6.offset:以文件开始处的偏移量,必须是4k的整数倍,通常为零,表示从文件头开始映射。

munmap函数:

函数作用:释放由mmap函数建立的存储映射区

函数原型: int munmap(void *addr, size_t length);

返回值:成功返回0

失败返回-1

函数参数:addr:调用mmap函数成功返回的映射区首地址

length:映射区大小(同mmap函数的第二个参数)

使用mmap函数在父子进程进行通信:

注意:要映射的文件大小要大于零,不然映射不出来

子进程的sleep(1)是防止子进程先进行,让父进程先写

父子进程共享文件描述符,共享共享映射区

结果:

使用mmap函数在无血缘关系进程间进行通信:

这是mmap_cpy.c文件(执行写进程):

这是 mmap_read.c文件(执行读进程):

结果

由结果可知写进程提前结束,读进程也可以读到内容

而通过FIFO文件进行通信时,写进程不能比读进程提前结束,不然读不到内容

如果 mmap_cpy.c文件的映射方式为MAP_PRIVATE时,mmap_read.c文件无法读到改变的内容

注意点:

  • 创建映射区的过程中,隐含着一次对映射文件的读操作,将文件内容读取到映射区

  • 当使用MAP_SHARED 时,要求:映射区的权限<=文件打开的权限

  • 映射区的释放于文件关闭无关,只要映射成功,文件可以立即关闭

  • 映射文件大小必须有实际大小,不能为0.

  • munmap传入的地址一定是mmap的返回地址。杜绝使用指针++操作

  • 文件偏移量必须是0或者4k的整数倍

  • mmap创建映射区的出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作

匿名映射:

mmap(NULL,4096,PROT_READ| PROT_WRITE,MAP_SHAERD | MAP_ANONYMOUS,

-1,0);

MAP_ANONYMOUS必须与MAP_SHARED一起用,而且fd为-1

只能用于有血缘关系的进程

相关推荐
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
程序员清风1 天前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林5511 天前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
颜酱1 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub1 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
华仔啊2 天前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端