利用mmap实现的一个文件拷贝例子,供大家参考,具体内容如下
/* * gcc -Wall -O3 -o copy_mmap copy_mmap.c */ #include < stdio.h > #include < stdlib.h > #include < string .h > /* for memcpy */ #include < strings.h > #include < sys / mman.h > #include < sys / types.h > #include < sys / stat.h > #include < fcntl.h > #include < unistd.h > #define PERMS 0600 int main ( int argc, char * argv[] ) { int src, dst; void * sm, * dm; struct stat statbuf; if ( argc != 3 ) { fprintf( stderr, " Usage: %s \n " , argv[ 0 ] ); exit( EXIT_FAILURE ); } if ( ( src = open( argv[ 1 ], O_RDONLY ) ) < 0 ) { perror( " open source " ); exit( EXIT_FAILURE ); } /* 为了完成复制,必须包含读打开,否则mmap()失败 */ if ( ( dst = open( argv[ 2 ], O_RDWR | O_CREAT | O_TRUNC, PERMS ) ) < 0 ) { perror( " open target " ); exit( EXIT_FAILURE ); } if ( fstat( src, & statbuf ) < 0 ) { perror( " fstat source " ); exit( EXIT_FAILURE ); } /* * 参看前面man手册中的说明,mmap()不能用于扩展文件长度。所以这里必须事 * 先扩大目标文件长度,准备一个空架子等待复制。 */ if ( lseek( dst, statbuf.st_size - 1 , SEEK_SET ) < 0 ) { perror( " lseek target " ); exit( EXIT_FAILURE ); } if ( write( dst, & statbuf, 1 ) != 1 ) { perror( " write target " ); exit( EXIT_FAILURE ); } /* 读的时候指定 MAP_PRIVATE 即可 */ sm = mmap( 0 , ( size_t )statbuf.st_size, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, src, 0 ); if ( MAP_FAILED == sm ) { perror( " mmap source " ); exit( EXIT_FAILURE ); } /* 这里必须指定 MAP_SHARED 才可能真正改变静态文件 */ dm = mmap( 0 , ( size_t )statbuf.st_size, PROT_WRITE, MAP_SHARED, dst, 0 ); if ( MAP_FAILED == dm ) { perror( " mmap target " ); exit( EXIT_FAILURE ); } memcpy( dm, sm, ( size_t )statbuf.st_size ); /* * 可以不要这行代码 * * msync( dm, ( size_t )statbuf.st_size, MS_SYNC ); */ return ( EXIT_SUCCESS ); }
mmap()好处是处理大文件时速度明显快于标准文件I/O,无论读写,都少了一次用户空间与内核空间之间的复制过程。操作内存还便于设计、优化算法。
文件I/O操作/proc/self/mem不存在页边界对齐的问题,但至少Linux的mmap()的最后一个形参offset并未强制要求页边界对齐,如果提供的值未对齐,系统自动向上舍入到页边界上。malloc()分配得到的地址不见得对齐在页边界上。
/proc/self/mem和/dev/kmem不同。root用户打开/dev/kmem就可以在用户空间访问到内核空间的数据,包括偏移0处的数据,系统提供了这样的支持。显然代码段经过/proc/self/mem可写映射后已经可写,无须mprotect()介入。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍使用mmap实现多进程对大文件拷贝,包括了使用mmap实现多进程对大文件拷贝的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了mmap实现文件多进程拷贝,供大家参考,具体内容如下 假设有一个超大文件,需对其完成拷贝工作。为提高效率,可采用多进程并行拷贝的方法来实现。假设文件大小为len,共有n个进程对该文件进行拷贝。那每个进程拷贝的字节数应为len/n。但未必一定能整除,
如何拷贝一个文件到另一个文件?最简单的方式就是使用 io 包: 示例 12.10 filecopy.go: // filecopy.go package main import ( "fmt" "io" "os" ) func main() { CopyFile("target.txt", "source.txt") fmt.Println("Copy
本文向大家介绍如何使用Python脚本实现文件拷贝,包括了如何使用Python脚本实现文件拷贝的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了如何使用Python脚本实现文件拷贝,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.实现目的 统一时间对服务器某文件夹内文件进行备份保存,如若备份成功则不提示任何错误,否则将以邮件的形式告知
本文向大家介绍深拷贝浅拷贝的区别和实现?相关面试题,主要包含被问及深拷贝浅拷贝的区别和实现?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 数组的浅拷贝: 如果是数组,我们可以利用数组的一些方法,比如slice,concat方法返回一个新数组的特性来实现拷贝,但假如数组嵌套了对象或者数组的话,使用concat方法克隆并不完整,如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或数
本文向大家介绍java 实现文件夹的拷贝实例代码,包括了java 实现文件夹的拷贝实例代码的使用技巧和注意事项,需要的朋友参考一下 java 实现文件夹的拷贝实例代码 这里就直接上代码,废话不多说,很简单很实用。 实例代码: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍Python浅拷贝与深拷贝用法实例,包括了Python浅拷贝与深拷贝用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python浅拷贝与深拷贝用法。分享给大家供大家参考。具体分析如下: 浅拷贝,创造了新的对象,但是它的对象引用确和被拷贝对象一致。 如果被拷贝对象的构成元素是不可变类型,则拷贝对象对这个元素的改变,实际上是创造一个新的对象。 如果被拷贝对象的构成元素是可
本文向大家介绍linux下如何实现快速拷贝大文件,包括了linux下如何实现快速拷贝大文件的使用技巧和注意事项,需要的朋友参考一下 拷贝数据 远程拷贝数据的时候,我们一般使用rsync命令,但是如果拷贝大量的小文件,会导致rsync的传输速度慢。使用tar pv lz4打包压缩传输,可以解决这问题,使用这个方法,等同于使用scp、rsync传输大文件。 实测,使用rsync传输1200G,单个文件
本文向大家介绍Java Clone深拷贝与浅拷贝的两种实现方法,包括了Java Clone深拷贝与浅拷贝的两种实现方法的使用技巧和注意事项,需要的朋友参考一下 1.首先,你要知道怎么实现克隆:实现Cloneable接口,在bean里面重写clone()方法,权限为public。 2.其次,你要大概知道什么是地址传递,什么是值传递。 3.最后,你要知道你为什么使用这个clone方法。 先看第一条,简