mmap的是将文件指定的区域映射到内存缓冲区中,从缓冲区中读取数据就相当于从文件中读取相应数据,对缓冲区进行写操作相当于写入文件相应位置。
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);//将文件映射到内存中,addr和offset通常为0,length是映射的内存长度,prot是内存的权限(不能高于fd的打开权限),flags是内存属性 int munmap(void *addr, size_t length);//解除该映射一个实例,将文件映射到内存然后直接操作内存从而写入文件
#include<stdio.h> #include<string.h> #include<sys/mman.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<stdlib.h> int main(){ int fd=open("1.txt",O_RDWR|O_CREAT,S_IRWXU);//创建文件 lseek(fd,49,SEEK_SET);//由于刚创建的文件为空,需要先扩充文件内容,才能mmap映射至内存后操作内存,不然会报错 write(fd," ",1);//象征性的写一个字 void *buf=mmap(NULL,30,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//length参数不足一个内存页按照一个内存页计算(512B) memcpy(buf,"hello world\nso beautiful\n",strlen("hello world\nso beautiful\n"));//直接操作内核缓冲区,最后的结果写入文件 printf("%s",buf); //msync(buf,30,MS_SYNC);//等到写入文件后返回,这里未使用 //munmap(buf,20);//解除映射 exit(0); }文件内容:
hello world
so beautiful
在网络编程中,文件映射可以快速IO,因为这比read/write组合调用少了内核缓冲区到用户态缓冲区(read)和用户缓冲区到内核态(write)两次拷贝。
mmap还可以作为内存共享,这种方式通常不映射文件,将mmap函数参数的flags置为MAP_ANNON,fd置为-1,就可以实现内存共享(没有映射到文件),创建一个length大小的可读写的共享内存方式例如:
void* mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0)当有了共享内存后,多个亲缘进程间就可以通过内存指针进行通信。