概述
内存映射通信
一、mmap (memory_map)
1.1 简介
存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。这样,就可在不适用read和write函数的情况下,使用地址(指针)完成I/O操作。使用这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。
1.2 mmap函数
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数:
addr: 指定映射区的首地址。通常传 NULL,表示让系统自动分配
length:共享内存映射区的大小。(<= 文件的实际大小)
*如果使用length > 文件大小,那么就会出现总线错误*
prot: 共享内存映射区的读写属性。PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE
flags: 标注共享内存的共享属性。MAP_SHARED、MAP_PRIVATE
shared 意思是修改会反映到磁盘上
private 表示修改不反映到磁盘上
fd: 用于创建共享内存映射区的那个文件的 文件描述符。
offset:默认 0,表示映射文件全部。偏移位置。需是 4k 的整数倍。
返回值:
成功:映射区的首地址。
失败:MAP_FAILED (void*(-1)), errno
二、程序例程
2.1 mmap建立映射区
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
void sys_err(const char* str){
perror(str);
exit(1);
}
/*
mmap:memorty_map 内存映射试验
*/
int main(int argc,char* argv[]){
char *p = NULL; //用于接收mmap的返回地址
int fd; //用于文件的接收
fd = open("testmmap", O_RDWR | O_CREAT | O_TRUNC, 0664);
if(fd == -1){//打开失败
sys_err("open error");
}
/*
lseek(fd, 9, SEEK_END); //将文件给扩展长度到10
write(fd, "