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

 更新时间:2021年12月21日 08:31:24   作者:Jxiepc  
这篇文章主要介绍了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指针原理教程之语法树及其实现

    C指针原理教程之语法树及其实现

    本文给大家分享的是如何使用C语言的指针原来来实现语法树,并给大家提供了详细的实例代码,希望大家能够喜欢
    2019-02-02
  • C语言实现文件内容按行随机排列的算法示例

    C语言实现文件内容按行随机排列的算法示例

    这篇文章主要介绍了C语言实现文件内容按行随机排列的算法,涉及C语言字符串、数组遍历与随机数相关算法实现技巧,需要的朋友可以参考下
    2017-09-09
  • DSP中浮点转定点运算--定点数的加减乘除运算

    DSP中浮点转定点运算--定点数的加减乘除运算

    本文主要介绍DSP中定点数的加减乘除运算,很值得学习一下,需要的朋友可以参考一下。
    2016-06-06
  • 一个win32窗口创建示例

    一个win32窗口创建示例

    这篇文章主要介绍了一个win32窗口创建示例,需要的朋友可以参考下
    2014-04-04
  • C语言实现线索二叉树的前中后创建和遍历详解

    C语言实现线索二叉树的前中后创建和遍历详解

    这篇文章主要为大家详细介绍了C语言实现线索二叉树的前中后创建和遍历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++第三方日志库Glog的安装与使用介绍

    C++第三方日志库Glog的安装与使用介绍

    这篇文章主要介绍了C++第三方日志库Glog的安装与使用介绍,本文配置所采用的环境为Visual Studio2017,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 深入理解C++函数栈帧

    深入理解C++函数栈帧

    本文主要介绍了C++函数栈帧,详细的介绍了C++函数栈帧的概念以及使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C语言实现清空指定文件夹中所有文件的方法

    C语言实现清空指定文件夹中所有文件的方法

    这篇文章主要介绍了C语言实现清空指定文件夹中所有文件的方法,实例分析了C语言实现文件删除的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C++ 使用CRC32检测内存映像完整性的实现步骤

    C++ 使用CRC32检测内存映像完整性的实现步骤

    当我们使用动态补丁的时候,那么内存中同样不存在校验效果,也就无法抵御对方动态修改机器码了,为了防止解密者直接对内存打补丁,我们需要在硬盘校验的基础上,增加内存校验,防止动态补丁的运用。
    2021-06-06
  • visual studio 2019编译c++17的方法

    visual studio 2019编译c++17的方法

    这篇文章主要介绍了visual studio 2019编译c++17的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论