linux mmap & munmap & msync

mmap & munmap & msync

mmap() 将文件或对象映射到内存地址空间。

mmap()必须以PAGE_SIZE为单位进行映射,而内存也只能以页为单位进行,若要映射非PAGE_SIZE整数倍的地址范围,要先进行内存对齐,强行以PAGE_SIZE的倍数大小进行映射。

文件一旦被映射后,调用mmap()的进程对返回地址的访问是对某一内存区域的访问,暂时脱离了磁盘上文件的影响。所有对mmap()返回地址空间的操作只在内存中有意义,只有在调用了munmap()后或者msync()时,才把内存中的相应内容写回磁盘文件,所写内容仍然不能超过文件的大小。

#include <sys/mman.h>

/**
 * mmap - 将文件或设备映射到内存空间
 * @addr 映射区的开始地址,设置为0时表示由系统决定映射区的起始地址
 * @length 映射区的长度,以字节为单位
 * @prot 内存保护标志
 * @flags 指定映射对象的类型,映射选项和映射页是否可以共享
 * @fd 映射文件的描述符
 * @offset 被映射对象内容的起始点
 */
void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);

/**
 * munmap - 解除文件或设备与内存的映射关系
 * @addr 映射区的开始地址,即调用 mmap()时返回的地址
 * @length 映射区的长度,以字节为单位
 */
int munmap(void* addr, size_t length);

/**
 * msync - 实现磁盘文件内容与共享内存区中的内容一致,即同步操作
 * @addr 映射区的开始地址,即调用 mmap()时返回的地址
 * @length 映射区的长度,以字节为单位
 * @flags 刷新的参数设置
 */
int msync(void* addr, size_t length, int flags);
原文地址:https://www.cnblogs.com/tongyishu/p/14063106.html