这篇文章主要介绍了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++使用mmap实现多进程拷贝文件的文章就介绍到这了,更多相关C++ 多进程拷贝文件内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
沃梦达教程
本文标题为:C++使用map实现多进程拷贝文件的程序思路
基础教程推荐
猜你喜欢
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 设计字符串本地化的最佳方法 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01