iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++使用map实现多进程拷贝文件的程序思路
  • 603
分享到

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

2024-04-02 19:04:59 603人浏览 安东尼
摘要

程序思路 1. 指定创建子进程的个数 2. 打开源文件 3. 打开目的文件, 不存在则创建 4. 获取文件大小 5. 根据文件大小拓展目标文件 6. 为源文件创建映射 7. 为目标文

程序思路

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

--结束END--

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

本文链接: https://www.lsjlt.com/news/160407.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作