mmap多进程拷贝文件

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<cstdlib>
#include<sys/wait.h>
using namespace std;

int main(int argc, char * argv[])
{
        int progress = 5;
        struct stat buf;
        int fd_r,fd_w;
        pid_t pid;
        char *p = new char;
        int i=0;
        fd_r = open(argv[1], O_RDONLY); //需要读取的文件
        if(-1 == fd_r)
        {
                perror("open argv[1] error");
                return -1;
        }
        stat(argv[1], &buf);
        int len = buf.st_size;
        //这里必须要有读权限,因为mmap进行映射的时候实际就是先读一次文件
        fd_w = open(argv[2], O_RDWR | O_CREAT, 0644); //需要复制的文件
        if(-1 == fd_w)
        {
                perror("open argv[2] error");
                return -1;
        }
        if(truncate(argv[2],  len) < 0) //给文件扩容
        {
                perror("truncate error");
                return -1;
        }
        int each_size = len / progress;
        int lase_size = len % progress;
        p = (char *)mmap(NULL, len, PROT_WRITE , MAP_SHARED, fd_w, 0);
        if( p == MAP_FAILED)
        {
                perror("mmap error");
                return -1;
        }
        for(i=0; i<progress ;i++)
        {
                pid = fork();
                if(pid == 0)
                        break;
                if(pid < 0)
                {
                        perror("fork error");
                        return -1;
                }
        }
        if(i < 5)
        {
                if(i < 4)
                {
                        int read_len = read(fd_r, p+i*each_size, each_size);
                        if(read_len != each_size)
                        {
                                perror("read error");
                        }
                }
                else
                {
                        int last_len = read(fd_r, p+i*each_size, each_size+lase_size);
                        if(last_len != each_size+lase_size)
                        {
                                perror("lase one read error");
                        }
                }
        }
        else
        {
                int n = progress;
                do{
                        int status;
                        pid_t w_pid = waitpid(-1, &status,WNOHANG);  
                        if(w_pid > 0)
                                n--;
                }while(n>0); //回收子进程
                cout<<"all progress finished\n";
                close(fd_r);
                close(fd_w);
                munmap(p, len);
        }
        cout<<"copy file finish\n";
        return 0;
}

总体思路是,把整个文件均分,然后每个子进程拷贝一部分,不过这个程序的做法似乎还有改进的空间,等以后做完了再贴出来给大家看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴塞罗那的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值