msync(void *addr,size_t len, int flags) 函数使用问题
【注意】:
只有在调用了munmap()后或者msync()时,才把内存中的相应内容写回磁盘文件,所写内容仍然不能超过文件的大小。
mmap系统调用共享内存
1. 解除内存映射函数
munmap
功能:用来取消参数 【映射的内存地址】所指向的内存起始地址,成功返回0,失败返回-1
#include<unistd.h>
#include<sys/mman.h>
int munmap( void * start, size_t len )
start 是调用mmap()时返回的地址,len是映射区的大小。当进程结束或使
用exec相关函数来执行其他程序时,映射内存会自动解除,但关闭相应的
文件描述符不会解除映射。当映射关系解除后,对原来映射地址的访问将
导致段错误发生。
2. 刷新变化函数
msync
功能:进程在映射空间的对共享内容的改变并不直接写回到磁盘文件中,
往往在调用munmap()后才执行该操作。可以通过调用msync()实现磁盘上
文件内容与共享内存区的内容一致。成功返回0,失败返回-1
#include<unistd.h>
#include<sys/mman.h>
int msync ( void * addr /*刷新的地址*/, size_t len/*大小*/, int flags) /标志和权限/
3. 在使用过程中应该注意的地方:
1). 最终被映射文件的内容的长度不会超过文件本身的初始大小,即映射不能改变文件的大小;
2). 可以用于进程通信的有效地址空间大小大体上受限于被映射文件的大小,但不完全受限于文件大小。
注:在linux中,内存的保护是以页为基本单位的,即使被映射文件只有一
个字节大小,内核也会为映射分配一个页面大小的内存。当被映射文件小
于一个页面大小时,进程可以对从mmap()返回地址开始的一个页面大小进
行访问,而不会出错;但是,如果对一个页面以外的地址空间进行访问,
则导致错误发生,后面将进一步描述。因此,可用于进程间通信的有效地
址空间大小不会超过文件大小及一个页面大小的和。
3)、文件一旦被映射后,调用mmap()的进程对返回地址的访问是对某一
内存区域的访问,暂时脱离了磁盘上文件的影响。所有对mmap()返回地址
空间的操作只在内存中有意义,只有在调用了munmap()后或者msync()
时,才把内存中的相应内容写回磁盘文件,所写内容仍然不能超过文件的
大小。