这篇文章主要介绍了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实现多进程拷贝文件的程序思路
猜你喜欢
- DoEvents 等效于 C++? 2021-01-01
- 如何提取 __VA_ARGS__? 2022-01-01
- OpenGL 对象的 RAII 包装器 2021-01-01
- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- GDB 不显示函数名 2022-01-01
- XML Schema 到 C++ 类 2022-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- 将 hdc 内容复制到位图 2022-09-04