mmap()在进程的的用户空间创建一个新的虚存取,可以用于磁盘文件和内存空间相互映射。
把文件映射到进程的用户空间以后,就额可以像访问内存一样,访问文件。对于大文件的复制有明显速度上的优势。当然映射的内存区域越大,效率越高。
munmap() 销毁一个完整的虚存区或其中一部分,如果要取消的虚存区位于某个虚存区的中间,则这个虚存区被划分为两个虚存区。
以下是使用mmap()实现的复制文件的代码
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<sys/mman.h> #include<stdlib.h> #include<string.h> #define BUF_SIZE 4096 int main(int argc,char *argv[]) { //参数检测 if(argc < 3) { printf("parameter ERROR!\n"); exit(-1); } int fd_w,fd_r; void *buf_r,*buf_w; int length_r,length_w,off=0; fd_w=open(argv[2], O_RDWR | O_CREAT | O_TRUNC,0644); fd_r=open(argv[1],O_RDONLY); //获取文件长度 length_r=lseek(fd_r,0,SEEK_END); length_w=lseek(fd_w,length_r-1,SEEK_CUR); //设置文件大小 或者 ftruncate(fd_w,length_r); write(fd_w,"0",1); lseek(fd_r,0,SEEK_SET); lseek(fd_w,0,SEEK_SET); while(1){ if(length_r-off < BUF_SIZE){ buf_r=mmap(0,length_r-off,PROT_READ,MAP_SHARED,fd_r,off); buf_w=mmap(0,length_r-off,PROT_WRITE,MAP_SHARED,fd_w,off); memcpy(buf_w,buf_r,length_r-off); //关闭映射 munmap(buf_r,length_r-off); munmap(buf_w,length_r-off); break; }else{ buf_r=mmap(0,BUF_SIZE,PROT_READ,MAP_SHARED,fd_r,off); buf_w=mmap(0,BUF_SIZE,PROT_WRITE,MAP_SHARED,fd_w,off); memcpy(buf_w,buf_r,BUF_SIZE); //关闭映射 munmap(buf_r,BUF_SIZE); munmap(buf_w,BUF_SIZE); } } close(fd_w); close(fd_r); return 0; }
学习参考:http://blog.csdn.net/nocodelife/article/details/8647499
http://blog.csdn.net/tody_guo/article/details/5478085