单线程和多进程实现文件的复制(mmap方法)

mmap实现大文件的复制

  • 单线程和多进程实现文件的复制(mmap方法)
  • 一、单线程实现
  • 二、多进程实现

一般文件实现方法:
1.读取(fread)要复制的文件
2.写入(fwrite)目标文件
mmap实现方法:
1.源文件和目标映射到内存空间
2.memcpy进行拷贝

一、单线程实现

#include <cstdio>
#include <stdio.h>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <memory.h>
using namespace std;int file_size(char* filename)
{struct stat statbuf;stat(filename,&statbuf);int size = statbuf.st_size;return size;}int main(int argc,char* argv[])
{//参数一:要拷贝的文件路径名if (argv[1] == ""){printf("参数不能为空");exit(1);}//参数二:目标文件路径名if (argv[2] == ""){printf("参数不能为空");exit(1);}void* s_ptr;void* o_ptr;int s_ret=0,o_ret=0;//打开源文件,只读模式s_ret = open(argv[1],O_RDONLY);if (s_ret == -1){perror("file error:");exit(1);}//目标模式,没有则创建,只写模式o_ret = open(argv[2], O_CREAT|O_RDWR,0644);if (o_ret == -1){perror("file error:");exit(1);}//获取文件大小int size = file_size(argv[1]);//printf("file size: %d   \n",size);//扩展目标文件ftruncate(o_ret,size);//内存映射s_ptr=mmap(NULL, size, PROT_READ, MAP_PRIVATE, s_ret, 0);o_ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, o_ret, 0);if (o_ptr == MAP_FAILED){perror("s_ptr mmap error:");exit(1);}//关闭文件描述符close(s_ret);close(o_ret);//实现拷贝memcpy(o_ptr,s_ptr,size);//释放映射空间munmap(s_ptr,size);munmap(o_ptr, size);return 0;
}

二、多进程实现

#include <cstdio>
#include <stdio.h>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <memory.h>
#include <sys/wait.h>
using namespace std;int file_size(char* filename)
{struct stat statbuf;stat(filename,&statbuf);int size = statbuf.st_size;return size;}int main(int argc,char* argv[])
{//参数一:要拷贝的文件路径名if (argv[1] == ""){printf("参数不能为空");exit(1);}//参数二:目标文件路径名if (argv[2] == ""){printf("参数不能为空");exit(1);}char* s_ptr;char* o_ptr;int n = 5;//创建子进程的个数int s_ret=0,o_ret=0;int i=0;//打开源文件,只读模式s_ret = open(argv[1],O_RDONLY);if (s_ret == -1){perror("file error:");exit(1);}//目标模式,没有则创建,只写模式o_ret = open(argv[2], O_CREAT|O_RDWR,0644);if (o_ret == -1){perror("file error:");exit(1);}//获取文件大小int size = file_size(argv[1]);//printf("file size: %d   \n",size);//扩展目标文件ftruncate(o_ret,size);//内存映射s_ptr=(char*)mmap(NULL, size, PROT_READ, MAP_PRIVATE, s_ret, 0);o_ptr = (char*)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, o_ret, 0);if (o_ptr == MAP_FAILED){perror("s_ptr mmap error:");exit(1);}//关闭文件描述符close(s_ret);close(o_ret);//实现拷贝int each_size = size / n;int last_size = size - (n * each_size);pid_t pid;//循环创建子进程for (i = 0; i < n; i++){pid = fork();if (pid == 0){break;//子进程退出循环}}if (n == i)//主进程{sleep(i);memcpy(o_ptr + i * each_size, s_ptr + i * each_size, last_size);waitpid(-1,NULL, WNOHANG);}else{sleep(i);memcpy(o_ptr + i * each_size, s_ptr+ i * each_size, each_size);}//释放映射空间munmap(s_ptr,size);munmap(o_ptr, size);return 0;
}

不完美的地方
主进程只是采用sleep函数来避免子进程变成僵尸进程,用信号的方式可以改进。

使用mmap实现大文件的复制:单进程与多进程情况相关推荐

  1. 文件内存映射mmap解决大文件快速读写问题和进程间共享内存

    mmap函数主要用途有三个: 1.将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能: 2.将特殊文件进行匿名内存映射,可以为关联进程提供共 ...

  2. php并发取源码,PHP读取大文件源码示例-Swoole多进程读取大文件

    PHP读取大文件源码示例,通过PHP读取过大.超大型文件的思路及解决方案. 在日常读取文件时,若文件 不是很大,通常使用file_get_contents,将内容一次性载入的变量中,也可以远程加载网页 ...

  3. mac u盘文件过大 拷贝不进去_Mac大文件无法复制到U盘怎么办

    我们在处理一些比较大的文件时候,一般会采用用U盘的方法,因为u盘的方式比直接下载快很多,有一些在用Mac的朋友反应:他们在向U盘拷贝文件时总会遇到"文件太大,无法拷贝"的一个错误提 ...

  4. 计算机专业大几用到移动硬盘,大文件复制到移动硬盘的方法

    大文件复制到移动硬盘的方法 大文件如何复制到移动硬盘本文是小编精心编辑的大文件复制到移动硬盘的方法,希望能帮助到你! 大文件复制到移动硬盘的方法篇一 一.网线的选择 在短距离传输中五类.超五类.六类都 ...

  5. linux ftp显示进度条,Shell中复制大文件显示进度

    "世间最痛苦的事莫过于等待..." 在Shell下进行大文件的复制时,常常要耗很长世间,这是一个相当乏味的过程,在GUI程序中常常会显示进度条或者完成百分比,但在Shell中如何来 ...

  6. java管道流文件的复制_JavaIO 总结笔记三 基本字节字符输入输出流和文件复制...

    一.IO体系 1.流主要分两大类:字节流 字符流 2.在硬盘上的文件,都是以二进制字节形式存储的,所以不管啥文件,读写时都应该用字节流 3.在java的早期版本中,的确只有字节流,没有字符流 4.一个 ...

  7. fread读取整个文件_qt如何实现大文件的加载和显示

    最近研究了下如何用qt的原生控件来加载和显示大文件(>1G),分享下一些摸索经验. 下文源码: compilelife/loginsight​github.com 文件的内存映射 在开始qt部分 ...

  8. springboot上传大文件时内存溢出的可能解决办法

    springboot上传大文件时内存溢出的可能解决办法 在springboot中上传大文件时要考虑内存的情况,一般我们会通过在执行服务时加入-Xms512m -Xmx512m等参数加大堆内存,但这是指 ...

  9. u盘无法复制文件进去_U盘无法复制超过4GB的大文件怎么办?

    相信许多朋友经常通过U盘复制文件来转移数据,但可能会碰到下面的情况:U盘上明明还有大于4GB的空间,但只要复制超过4G大小的文件就提示文件太大而无法复制,是什么问题呢?该如何解决?下面IT技术资料分享 ...

最新文章

  1. 保护眼睛设置.txt
  2. 图解Redis事务机制
  3. Oracle视图添加约束,Oracle的约束视图
  4. 软件架构最佳实践和案例分析
  5. 设计模式21:State 状态模式(行为型模式)
  6. discuz x2.5用户注册后邮箱认证后无法收到邮件或者直接进垃圾箱
  7. python不用sort排序_Python排序之sortamp;sorted
  8. 山东大学软件学院2022数据化企业期末复习总结
  9. wangeditor富文本编辑器的复制word到浏览器发生乱码
  10. 图形学中常用计算几何总结
  11. 李沐的动手学深度学习环境配置
  12. 安卓移动开发实验:Android Studio设计微信界面
  13. 2048游戏代码java总结_软件工程——Java版2048游戏学习报告
  14. python中的函数 - function
  15. 做人要厚道,做技术更要如此
  16. 五十八、Sqoop的常用参数及命令
  17. Mac程序坞中软件删除出现残留“?”图标无法删除解决方法:
  18. 电子烟的核心是什么,怎么判断电子烟好坏
  19. ultraedit软件下载
  20. XGB(有监督学习)和多维时序模型结合——预测风电出力

热门文章

  1. Unicode与JavaScript详解 [很好的文章转]
  2. 《计算机组成与体系结构:性能设计》读后小记 6、外部存储器
  3. 树莓派 红灯不亮_请问我的树莓派烧了系统后板子只有红灯亮,而act绿灯不亮,并且网口不插网线两个灯都是微微亮,请问?...
  4. python安装界面翻译_python环境搭建
  5. mkdir -p命令
  6. c++ socket学习(1.1)
  7. Postgresql中的hybrid hash join(无状态机讲解)
  8. 数字图像处理知识总结
  9. nextgaussian_Java Random nextGaussian()方法与示例
  10. kotlin 计算平方_Kotlin程序计算自然数之和