存储映射,就是讲磁盘文件映射到内存,则对相应内存的操作就相当于对磁盘文件的操作。
和存储映射相关的4个函数:mmap,mprotect,msync,munmap
1.void *mmap(void *addr,size_t len,int pro,int flags,int filedes,off_t offset) /*建立存储映射*/
作用: 一、就是建立文件filedes中从offset开始起的到内存的映射,映射的长度为len,
二、映射的地址与flags的值及addr的值有关,如果flag为MAP_FIXED则必须映射到addr指定的内存区;
如果flag不为MAP_FIXED 且addr不为0,则是推荐给系统,映射到内存addr的位置,系统可接受也可不接受而映射到其他地址
如果flag不问MAP_FIXED且addr为0,则由内核自己分配其地址
最终的地址都将返回
三、pro 就是对存储区的读写执行等的操作。不可和打开原始文件时的操作冲突。
四、flags的值可为MAP_SHARED,MAP_PRIVATE,MAP_FIXED。
1.MAP_SHARED时,对存储区的操作直接影响到源文件
2.MAP_PRIVATE时,相当于进程对映射存储区的一个副本,对该副本的操作不会影响到源文件
3.MAP_FIXED的作用如上
2.int mprotect(void *addr,size_t len,int pro)
建立好存储映射后,对映射区的读写执行方式进行修改
3.int msync(void *addr,size_t len,int flags)
映射存储区与源文件的同步
4.int munmap(void *addr, size_t len)
关闭映射存储区与源文件的关系,并不是消除掉映射存储区。即映像存储区仍然存在,只是此时对映像存储区的操作不再会映像到源文件。
注意:1.addr ,offset 要是页大小的整数倍。
2.必须先打开文件,放开对其进行存储映射
3.在map时将flag指定为MAP_SHARED的情况下,如果文件中的内容改变,则会自动更新映射区的内容。