`
cloudtech
  • 浏览: 4682310 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

使用mmap即文件映射实现文件的快速复制

 
阅读更多

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main(int argc,char *argv[])
{
int fd_r,fd_w;
struct stat file_stat;
int file_len_r;
char *file_buf_r,*file_buf_w;


//打开将要拷贝的文件


fd_r = open("./read_file",O_RDONLY);


if(fd_r == -1)
{
perror("open file fail:");
exit(1);
}


//获取要拷贝文件的属性


if(fstat(fd_r,&file_stat)==-1)
{
perror("get file stat fail:");
close(fd_r);
exit(1);
}


//从属性中获取文件的长度
file_len_r = file_stat.st_size;
//如果文件长度为0,直接创建一个文件就ok了。


if(file_len_r==0)


{
if((fd_w=creat("./write_file",0666))==-1)
{
perror("create file fail:");
close(fd_r);
exit(1);
}
else
{
printf("a file has been copy\n");
close(fd_r);
close(fd_w);
return 0;
}
}
//将待拷贝文件的内容映射到内存。


file_buf_r =(char *)mmap(NULL,file_len_r,PROT_READ,MAP_SHARED,fd_r,SEEK_SET);
if(file_buf_r == MAP_FAILED)
{
perror("map file_read fail:");
close(fd_r);
exit(1);
}


//映射建立后关闭文件,只要映射建立,关闭文件映射关系依然存在。
close(fd_r);





//新建文件,用来存放拷贝文件的内容。


fd_w = open("./write_file",O_CREAT|O_RDWR,0666); //open file
if(fd_w == -1)
{
perror("open file fail:");
close(fd_r);
munmap(file_buf_r,file_len_r);
exit(1);
}


//设置新建文件的长度
ftruncate(fd_w,file_len_r);


//将新建文件和内存中的一段空间建立映射


file_buf_w =(char *)mmap(NULL,file_len_r,PROT_WRITE,MAP_SHARED,fd_w,SEEK_SET);
if(file_buf_w == MAP_FAILED)
{
perror("map file_write fail:");
close(fd_w);
munmap(file_buf_r,file_len_r);
exit(1);
}
//映射建立后,文件就可以关闭了,关闭了文件和内存之间的映射关系依然存在。
close(fd_w); //write file map success
//将要拷贝的文件的内容的映射空间,存放到新创建文件的映射文件的存储空间


if(memcpy(file_buf_w,file_buf_r,file_len_r)==NULL)
{
perror("memcpy fail:");
munmap(file_buf_r,file_len_r);
munmap(file_buf_w,file_len_r);
exit(1);
}
//将内存中的数据同步到文件即磁盘


if(msync(file_buf_w,file_len_r,MS_SYNC)==-1)
{
perror("msync fail:");
munmap(file_buf_r,file_len_r);
munmap(file_buf_w,file_len_r);
exit(1);
}


//结束文件和内存之间的映射。


printf("copy a file success\n");
munmap(file_buf_r,file_len_r);
munmap(file_buf_w,file_len_r);


return 0;
}
分享到:
评论

相关推荐

    linux mmap文件内存映射机制

    2. **图像处理**:在图像处理领域,利用`mmap`可以直接将图像文件映射到内存中进行处理,避免了数据的多次复制。 3. **实时系统**:在对时间敏感的应用中,如音频视频流媒体处理,`mmap`可以确保数据快速且可靠地...

    内存映射文件实现大数据量快速存储

    内存映射文件(Memory-Mapped File)是一种在操作系统层面实现高效大数据处理的技术,它允许将文件的内容直接映射到进程的虚拟内存空间中,使得应用程序可以像操作普通内存一样读写文件,从而实现快速的数据存取。...

    Linux下文件映射实现分析

    ### Linux下文件映射实现分析 #### 前言 在深入探讨Linux内核中文件映射的实现之前,我们先简要回顾一下文件映射的基本概念及其在Linux环境下的重要性。文件映射,简单来说,就是将一个或多个文件的全部或部分虚拟...

    使用mmap实现大文件的复制(单进程和多进程)

    在处理大文件复制时,使用mmap映射是一种高效的方式,尤其是当文件大小超过物理内存时,相比传统的read和write方法,mmap可以显著减少内存的使用。 单进程下的mmap文件复制流程包括: 1. 使用open函数打开源文件和...

    mmcp.zip_MMCP_mmCP路xyz_mmap_mmap 实现cp功能_mmap.xyz.com

    本文将深入探讨一个名为"mmcp"的工具,它利用mmap(Memory Mapped Files,映射文件到内存)技术来实现文件复制功能,即"mmcp"。该工具的开发者在设计时可能出于性能优化考虑,选择了mmap而非传统的读写文件方式,以...

    利用mmap实现文件拷贝功能

    在 Linux 系统中,mmap系统调用可以将文件映射到进程的地址空间中,从而实现文件拷贝。mmap系统调用的使用可以减少用户空间和内核空间之间的复制过程,提高文件拷贝的速度。 在上面的示例代码中,使用mmap系统调用...

    mmap的使用说明

    ### mmap的使用说明:深入解析PACKET_MMAP的实现与应用 #### 一、PACKET_MMAP概述 在深入探讨mmap技术之前,我们先理解一下PACKET_MMAP的背景和作用。PACKET_MMAP是一种高级网络编程技术,主要用于提高数据包捕获...

    linux下文件映射函数

    下面是一段简单的 C 代码示例,展示了如何使用 `mmap` 映射文件: ```c #include #include #include #include void *mmapfile(const char *file) { int filehandle; if ((filehandle = open(file, O_RDWR | ...

    关于UNIX上文件映射技术的学习报告

    在UNIX系统中,文件映射技术是一种高效的数据访问机制,主要通过`mmap`系统调用来实现。文件映射允许程序直接将文件内容映射到进程的虚拟内存空间,从而避免了传统I/O操作中频繁的数据复制,提升了性能。本学习报告...

    8.4 内存映射文件----

    在C++中,我们可以使用`&lt;fcntl.h&gt;`和`&lt;sys/mman.h&gt;`头文件中的函数来实现内存映射文件。在这个例子中,我们将会看到如何使用内存映射文件来读取BMP文件。BMP文件是一种常见的位图图像格式,通常包含图像的宽度、高度...

    使用内存映射文件处理大文件应用示例_内存映射_使用内存映射文件处理大文件应用示例_

    例如,在网络通信中,如果使用串口接收大文件,内存映射文件可以帮助快速地将接收到的数据存入文件,而不需要先写入临时缓冲区再进行文件写入,从而提高效率。 总的来说,内存映射文件是处理大文件的一种强大工具,...

    mmap内核驱动与应用程序

    `mmap1.c`可能是一个示例程序,它展示了如何使用mmap函数将文件`data.txt`映射到进程的虚拟内存中。在用户空间,通过调用`mmap()`函数,可以指定文件描述符、偏移量、长度、映射类型和保护模式,然后系统会返回一个...

    用内存映射文件方法处理大文件

    内存映射文件(Memory-Mapped File)是一种在操作系统层面实现的高效文件处理技术,它允许程序将文件直接映射到进程的虚拟地址空间中,使得文件数据可以像访问内存一样被读写。这种方式大大简化了大文件处理的过程,...

    Python3 mmap内存映射文件示例解析

    1. mmap内存映射文件 建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据。内存映射通常可以提供I/O性能,因为使用内存映射是,不需要对每个访问都建立一个...

    ShareMem(mmap)

    这里提到的mmap是操作系统的内存映射函数,它允许程序将文件或者设备的存储区域映射到进程的地址空间,从而实现高效的数据交换和内存共享。 在Android开发中,JNI被广泛用于加速性能敏感的代码段,或者调用系统库不...

    use-mmap-method.zip_mmap_space

    标题中的"use-mmap-method.zip_mmap_space"表明这是一个关于使用内存映射文件(Memory-Mapped File,简称mmap)技术的压缩包,主要探讨如何将文件写入内存空间。描述提到“use mmap method to write a file to own ...

    内存映射的封装 包含读、写文件

    封装好的内存映射库通常会提供接口,如`map_file()`用于映射文件,`unmap_file()`用于取消映射,`write_to_mapped_area()`和`read_from_mapped_area()`用于读写映射区域内的数据,使得开发者可以更方便地使用这一...

    mmap-record-android,MMAP记录.zip

    1. **内存映射API**:这是实现mmap技术的关键,它提供了接口供应用程序将文件映射到内存中,使得对文件的操作如同操作内存一样便捷。 2. **日志管理器**:负责创建、打开、追加和关闭日志文件。它能够确保在多线程...

Global site tag (gtag.js) - Google Analytics