文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++使用map实现多进程拷贝文件的程序思路

2024-04-02 19:55

关注

程序思路

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);
    }
    
    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++ 多进程拷贝文件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯