C++案例 | C++使用mmap实现多进程拷贝文件
文章目录
- 程序思路
- 完整代码
- 运行效果
程序思路
1. 指定创建子进程的个数2. 打开源文件3. 打开目的文件, 不存在则创建4. 获取文件大小5. 根据文件大小拓展目标文件6. 为源文件创建映射7. 为目标文件创建映射8. 求出每个子进程该拷贝的字节数9. 创建N个子进程10. 子进程完成分块拷贝(注意最后一个子进程拷贝起始位置)11. 释放映射区
完整代码
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <cstring>int main(int argc, char *argv[])
{ //1. 指定创建子进程的个数int proNum = 5;//2. 打开源文件int fd_r = open(argv[1], O_RDONLY);if(fd_r == -1){std::cout << "open error" << std::endl;exit(1);}//3. 打开目的文件, 不存在则创建int fd_w = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0666);if(fd_w == -1){std::cout << "open error" << std::endl;exit(1);}/*4. 获取文件大小*--------------* 相比于seek速度更快* */struct stat statbuf;stat(argv[1], &statbuf);int size = statbuf.st_size;//5. 根据文件大小拓展目标文件int ret = ftruncate(fd_w, size);if(ret == -1){std::cout << "ftruncate error" << std::endl;exit(1);}std::cout << argv[1] <<"的文件大小为:" << size << std::endl;//6. 为源文件创建映射char *mmp_r = (char *)mmap(NULL, size, PROT_READ, MAP_SHARED, fd_r, 0);if(mmp_r == MAP_FAILED){std::cout << "mmap error" << std::endl;exit(1);}close(fd_r);//7. 为目标文件创建映射char *mmp_w = (char *)mmap(NULL, size, PROT_WRITE, MAP_SHARED, fd_w, 0);if(mmp_w == MAP_FAILED){std::cout << "mmap error" << std::endl;exit(1);}//8. 求出每个子进程该拷贝的字节数int size_sp = size / proNum;int size_sle = size % proNum;//9. 创建N个子进程int i;for(i=0; i<proNum ; ++i){pid_t pid = fork();if(pid == -1){std::cout << "fork error" << std::endl;exit(1);}else if(pid == 0){ // 子进程/* 拷贝文件内容 */if(i < proNum - 1){memcpy(mmp_w+i*size_sp, mmp_r+i*size_sp, size_sp);std::cout << "我是进程" << i << "拷贝文件大小为:" << size_sp<< std::endl;}else{memcpy(mmp_w+i*size_sp, mmp_r+i*size_sp, size_sp+size_sle);std::cout << "我是进程" << i << "拷贝文件大小为:" << size_sp+size_sle << std::endl;}break;}}munmap(mmp_r, size);munmap(mmp_w, size);return 0;
}
运行效果
C++案例 | C++使用mmap实现多进程拷贝文件相关推荐
- Linux多进程拷贝文件
学习了mmap以后,实现一个简单的小程序,进行多个进程对一个文件进行拷贝. Linux mmap共享内存学习可以参考我的另一篇博客:传送门 实现思想 我们可以将原来的文件利用mmap分成多个段分别进行 ...
- python3多进程写时拷贝_python利用进程池,多进程拷贝文件
#!/usr/bin/evn python #Author:ELSON_ZENG import os,time import multiprocessing def copy_file(queue, ...
- python多进程读同一个文件_python 多进程读写文件
import time from multiprocessing import Process, JoinableQueue, cpu_count import csv ####处理一条数据的方法 d ...
- 局域网内不定期拷贝文件到所有机器上怎么实现?
点量软件有遇到到过客户的这类需求:在一个局域网内需要定期把一些更新的文件拷贝到不同的机器上,每次文件从几百兆--几个G不等,怎么才能保证在局域网内部,能定期更新而且能做到完全的复制呢?点量BT下载插件 ...
- python 利用多进程实现文件的拷贝
python 利用多进程实现文件的拷贝 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37338590/article/details/784 ...
- 什么是mmap?零拷贝?DMA?
<Linux Zero-copy零拷贝技术全面揭秘> <什么是mmap?零拷贝?DMA?> <Linux C语言:用零拷贝技术实现TCP代理(源代码+测试服务端客户端代码 ...
- 【python3】 多线程以及多进程拷贝U盘图片数据
[python3] 多线程以及多进程拷贝U盘图片数据 1.背景 2.代码 3.运行结果及分析 1.背景 在做深度学习的时候,需要手动拷贝很多图片数据,发现U盘质量很差劲,拷贝非常耗时间,如下图: 于是 ...
- mmap拷贝文件与用常规文件IO拷贝文件效率对比
通常我们读写文件时,都是用系统提供的write和read函数,但是我们都知道文件IO函数操作文件流效率要低于mmap,因为mmap相对write/read省去将数据拷贝到用户态的操作.那么他们之间 ...
- 【Google Play】APK 扩展包 ( 2021年09月 最新处理方案 | 文件准备 | 拷贝文件至内置存储 | 解压及使用扩展文件 )
文章目录 前言 一.文件准备 二.拷贝文件至内置存储 三.解压及使用扩展文件 四.博客资源 前言 在上一篇博客 [Google Play]APK 扩展包 ( 2021年09月02日最新处理方案 | 内 ...
最新文章
- SQL Server使用侦听器IP访问时遇到The target principal name is incorrect. Cannot generate SSPI context...
- Apache Commons Pool 故事一则 专题
- (一)机器学习数据处理
- ThinkPHP- 3.1
- 安装linux出现基础系统出错,Linux系统出错提示信息详解
- Linux-Shell脚本学习心得(第二天)
- 2018CES智能硬件与新技术盘点
- Java 文件操作-RandomAccessFile
- 我为什么不无偿加班,你也不应该
- linux云自动化运维基础知识4(系统结构,vim,管理输入输出,正则表达式)
- 电脑连接上无线网却没有网,手机却能上网怎么解决
- C语言教程-Turbo C
- Win10使用以前的图片查看器
- java网络打印机_如何使用Java在网络打印机上进行打印?
- 职业投资策略(转贴)
- web前端设计与开发期末作品/期末大作业:我的家乡——走进达州(4页) HTML+CSS+JavaScript
- 国外优秀免费空间对比APPFOG VS TECHNETCAL
- 解读温度传感器应用于物联网+冷链行业
- 华为机试题:HJ108 求最小公倍数(python)
- qlv视频转换器免费版_腾讯视频素材下载和转换教程
热门文章
- PCIE中的加扰与解扰
- 道,术,象(万物皆有规律)
- 2020年宇通大量裁人论坛_重磅丨 2020年中国经济高峰论坛正式启动!
- golang 通过go get | go mod download下载安装包
- 【番杰的小技巧笔记】如何通过嘉立创免费打印立创EDA设计的PCB
- 【程序人生】怎样养生?关于中医的核心思想,经典著作,与西医理念的对比,优缺点
- 有道云笔记的快速剪报
- 2013计算机应用基础试题及答案,2013计算机应用基础(人教版)期末考试试题及答案 .doc...
- EDI的国内外发展现状
- 基于大数据的情绪分析(二)