当前位置: 代码迷 >> 综合 >> 进程间通信(七)mmap
  详细解决方案

进程间通信(七)mmap

热度:72   发布时间:2024-01-04 07:55:21.0

一 .mmap

#include<sys/mman.h>
void *mmap(void* addr, size_t len, int prot, int flag, int fileds, off_t off);
addr:指定要映射的用户空间开始地址,
len:映射长度 
prot:读写和执行权限    
flag:1)MAP_FIXED,映射地址必须是addr,如果没有此标志,且addr非0,只会把addr,当作建议地址;2)MAP_SHARED,修改映射的内存地址,相当于对文件的write,设置了此标志,子进程会继承父进程的存储映射;3)MAP_PRIVATE 对存储区的映射会创建该文件的一个私有副本,不会影响磁盘文件,与MAP_SHARED标志互斥;
off:文件的偏移,从文件偏移处开始映射
通常要求,addr,off是虚拟存储页长的整数倍,如果len不是页长的整数倍,通常提供页长整数倍的映射,对 多余的部分的存储空间的修改,不会影响文件;

二 .msync 和munmap

#include<sys/mman.h>
int msync(void* addr, size_t len, int flags);
该函数的作用是把存储空间的修改刷到文件上,如果映射是私有的,不会对文件有影响,addr需要是页长的整数倍.
flag:1)MS_ASYNC,通知内核把存储空间的内容写入文件,函数返回时可能还没写入文件;2)MS_SYSNC,等待写入文件完成,才返回;
#include<sys/mman.h>
int munmap(acddr_t addr, size_t len);
进程终止和调用munmap会导致映射关系解除,关闭文件描述不影响;
munmap不会导致对磁盘文件的写入,写入到映射区后,内存根据虚拟存储的算法自动写入文件;

三 .3个功能
mmap可以实现,3个功能,
1.通过映射文件到用户空间,减少读写文件的内存copy;
2.相关进程间的共享存储;

sh_area = mmap(0, SIZE, PROT_READ | PROT_WRTIE, MAP_ANON | MAP_SHARED, -1, 0)

创建此存储映射后,子进程会继承,实现共享存储
3.不相关相关进程的进程间共享存储;

sh_area = mmap(0, SIZE, PROT_READ | PROT_WRTIE, MAP_SHARED, onefd, 0)

不同的文件对同一个文件进行存储空间的映射