进程间通信(七)mmap

一 .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)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值