这篇文章主要介绍了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实现多进程拷贝文件的程序思路
基础教程推荐
猜你喜欢
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 我有静态或动态 boost 库吗? 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 常量变量在标题中不起作用 2021-01-01
