当前位置: 首页 > news >正文

mmap() 实现文件复制

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

相关文章:

  • [Linux内存管理-分页机制]—把一个虚拟地址转换为物理地址
  • C#也能动态生成Word文档并填充数据
  • Epoll实现服务器高并发
  • Linux中实现线程池
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之18---商业模式...
  • 凤巢能否成功关键还看用户体验
  • 谁能不查字典把这文章念出来我就服谁
  • Android开发指南-框架主题-意图和意图过滤器
  • XML相关资源
  • Android开发指南-框架主题-基础知识
  • 目前的一些感悟
  • Android开发指南-框架主题-用户界面
  • 部分生僻字
  • SQLServer中的Scanf和Printf
  • Java Swing入门基础 (转)
  • #Java异常处理
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 230. Kth Smallest Element in a BST
  • css系列之关于字体的事
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Mac转Windows的拯救指南
  • opencv python Meanshift 和 Camshift
  • python3 使用 asyncio 代替线程
  • spring boot 整合mybatis 无法输出sql的问题
  • Spring Cloud中负载均衡器概览
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 阿里云购买磁盘后挂载
  • 成为一名优秀的Developer的书单
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 二维平面内的碰撞检测【一】
  • 关于extract.autodesk.io的一些说明
  • 记一次用 NodeJs 实现模拟登录的思路
  • 前端代码风格自动化系列(二)之Commitlint
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​决定德拉瓦州地区版图的关键历史事件
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (42)STM32——LCD显示屏实验笔记
  • (6)设计一个TimeMap
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (poj1.3.2)1791(构造法模拟)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (力扣题库)跳跃游戏II(c++)
  • (十一)图像的罗伯特梯度锐化
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)setTimeout 和 setInterval 的区别
  • (转载)Linux网络编程入门
  • **CI中自动类加载的用法总结