一、存储映射I/O
1.原理:
2.mmap函数
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
作用:创建共享内存映射区
参数:addr:制定映射区的首地址(通常传NULL)系统自动分配
length:共享内存映射区大小
prot:共享内存映射区的读写属性 。PROT_READ 、PROT_WRITE 、 PROT_READ|PROT_WRITE
flags:标注共享内存的共享属性。 MAP_SHARED、MAP_PRIVATE
fd:y用于创建共享文件内存区的那个文件的文件描述符。
offset:偏移位置,是4k的整数倍(默认0表示映射文件全部)
返回值:成功:映射区的首地址
失败:MAP_FAILED
3.munmap函数
int munmap(void *addr, size_t length); 释放映射区
参数:addr:mmap函数的返回值
返回值:成功:0 失败:-1
4.mmap注意事项
①用于创建映射区的文件大小为0,实际指定非0大小创建映射区,出现“总线错误”
②用于创建映射区的文件大小为0,实际指定为0大小创建映射区,出现“无效参数”错误
③用于创建映射区的文件读写属性为只读,映射区属性为读写,出“无效参数”错误
④创建映射区,必须需要read权限,mmap的读写权限,应该<=文件的open权限
⑤offset必须是4096的整数倍(MMU映射最小单位:4k)
⑥对申请的映射区内存,不能越界访问
⑦munmap用于释放的地址,必须是mmap申请返回的地址
⑨映射区访问权限为私有,对内存所做所以修改,只对内存有效,不反映在物理内存上
⑩映射区访问权限为私有时,只需要open文件有读权限,用于创建映射区即可
二、mmap父子进程通信
父进程先创建映射区,open() mmap()
指定MAP_SHARED权限
fork()创建子进程
一个进程读,另一个进程写