首页 > 编程语言 > 详细

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

时间:2021-05-07 14:49:14      阅读:16      评论:0      收藏:0      [点我收藏+]
#define  __THR_CNT__ 5 //线程数
typedef struct CopyFileObj{
    int num;
    char *copySrc;
    char *copyDst;
    int size;
}CopyObj;
void * thrFun(void *arg)
{
    CopyObj *info =(CopyObj *)arg;
    int num = info->num;
    int casize = info->size/__THR_CNT__;
    int mod = info->size%casize;
    if(num == (__THR_CNT__ -1))
        memcpy(info->copyDst+num*casize,info->copySrc+num*casize,casize+mod);
    else
        memcpy(info->copyDst+num*casize,info->copySrc+num*casize,casize);
    pthread_exit(NULL);
}

int main(int argc,char *argv[])
{
    if(argc != 3)
    {   
        printf("err: app srcFile dstFile\n");
        exit(1);
    }   
    int fd_src =  open(argv[1],O_RDWR);
    if(fd_src < 0)
    {   
        perror("open src \n");
        exit(2);
    }   
    int fd_dst = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666);
    if(fd_dst < 0)
    {   
        perror("open dst \n");
        exit(2);
    }   
    int src_l = lseek(fd_src,0,SEEK_END);
    int ret;
    if ((ret =ftruncate(fd_dst,src_l))<0) {
        perror("ftruncate \n");
        exit(3);
    }                   
	char* mp_src = (char*)mmap(NULL,src_l,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,fd_src,0);
    if(mp_src == MAP_FAILED)
    {   
        perror("mp_src err");
        return -1;
    }
    close(fd_src);
    char* mp_dst = (char*)mmap(NULL,src_l,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,fd_dst,0);
    if(mp_dst == MAP_FAILED)
    {   
        perror("man err");
        return -1;
    }
    close(fd_dst);

    CopyObj tempObj[__THR_CNT__];
    // 创建线程 
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
    pthread_t tid[5];
    int i;
    for (i = 0; i < __THR_CNT__; ++i) {
        tempObj[i].copySrc = mp_src;
        tempObj[i].copyDst = mp_dst;
        tempObj[i].num = i;
        tempObj[i].size = src_l;
        pthread_create(&tid[i],&attr,thrFun,&tempObj[i]);
    }
    pthread_attr_destroy(&attr);
    pthread_exit(NULL);
    munmap(mp_src,src_l);
    munmap(mp_dst,src_l);

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

原文:https://www.cnblogs.com/lodger47/p/14738732.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!