Linux c++(多进程拷贝文件)

int main(int argc,char *argv[])
{
    if(argc != 3)
    {   
        printf("err: ./app filename\n");
        return -1; 
    }   
    int fd_src =  open(argv[1],O_RDWR);
    if(fd_src<0)
    {   
        perror("open src\n");
        exit(3);
    }   
    int fd_dst = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0666);
    if(fd_dst < 0)
    {   
        perror("open dst\n");
        exit(4);
    }   
    //获取文件原大小
    struct stat sbuf;
    int ret = fstat(fd_src,&sbuf); //fstat将fd_src所指向的文件信息保存到结构体sbuf中
    if(ret < 0)
    {   
        perror("fstat \n") ;
        exit(5);
    }   
    int flen = sbuf.st_size; //原文件大小
    //根据文件到校扩展目标文件
    ret = ftruncate(fd_dst,flen);
    if(ret < 0)
    {   
        perror("ftruncate \n");
        exit(5);
    }   
    //为源文件创建映射
    char* mp_src= (char*)mmap(NULL,flen,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,fd_src,0);
    if(mp_src== MAP_FAILED)
	   {   
        perror("mp_dsterr");
        return -1;
    }
    close(fd_src);
    char* mp_dst= (char*)mmap(NULL,flen,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,fd_dst,0);
    //求出每个进程拷贝的字节数
    int n = 5;//线程数
    int bs = flen/n;
    int mod = flen%bs; //求出均分后余下的字节数,让最后一个子进程处理
    char *temp_src = mp_src;
    char *temp_dst = mp_dst;
    int i;
    pid_t pid = 0;
    for (i = 0; i < n; ++i)
        if((pid=fork()) == 0)
            break;
    if(n == i)
    {
        int j =0;
        for (j = 0; j < n; ++j)
            wait(NULL);
    }else if(i == (n-1)) //最后一个子进程,他多处理均分后剩余的字节数
    {
        printf("i == %d\n",i);
        memcpy(temp_dst+i*bs,temp_src+i*bs,bs+mod);
    }else{
        printf("i = %d\n",i);
        memcpy(temp_dst+i*bs,temp_src+i*bs,bs);
    }
    //释放映射区
    munmap(mp_dst,flen);
    munmap(mp_src,flen);

posted on 2021-05-07 11:25  lodger47  阅读(302)  评论(0)    收藏  举报

导航