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