1 内存存储映射I/O (Memory-mapped I/O)
- 1)内存存储映射I/O简写为mmap,也是比较常用的进程间通信方式。
- 2)mmap使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入磁盘文件。这样,就可在不适用read和write函数的情况下,使用地址(指针)完成I/O操作。这个文件中个缓冲区也叫映射区。
- 3)使用这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。
- 4)映射的情况类似下图,将一个文件中的空间映射到内存,这个空间可以是文件的所有空间或者部分空间,可以自行设置,通过映射后,内存地址空间也叫映射区。
2 相关函数
2.1 mmap函数。
void *mmap(void *adrr, size_t length, int prot, int flags, int fd, off_t offset);
/*
功能: 将文件的所有空间或者部分空间映射到缓冲区,这个缓冲区也叫映射区。
返回: 成功:返回创建的映射区首地址;失败:MAP_FAILED宏。
参数:
addr: 建立映射区的首地址,由Linux内核指定。使用时,直接传递NULL。
length:欲创建映射区的大小。
prot: 映射区权限,主要使用到PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE,其余自行man查看。
flags: 标志位参数(常用于设定更新物理区域、设置共享、创建匿名映射区)。
MAP_SHARED: 会将映射区所做的操作反映到物理设备(磁盘)上。
MAP_PRIVATE: 映射区所做的修改不会反映到物理设备。
fd: 用来建立映射区的文件的文件描述符。
offset:映射文件的偏移位置(必须是4k的整数倍),默认偏移位置为0,表示映射整个文件大小。
*/
2.2 munmap函数
int munmap(void *addr, size_t length);
/*
功能:将mmap映射的区域释放,类似malloc,free。
成功:0; 失败:-1.
参1:mmap返回的首地址。
参2:mmap时创建的映射区长度。
*/