【无标题】

使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源

#include"day05.h"
struct Copy{     //定义结构体
    int len;    
    const char *src; 
    const char *des;
};
int get_len(const char*src,const char *des){  //获取长度
    int sfd=open(src,O_RDONLY);
    if(sfd==-1){
        printf("open src err\n");
        return -1;
    }
    int dfd=open(des,O_WRONLY|O_CREAT|O_TRUNC,0664);
    if(dfd==-1){
        printf("open dfs  err\n");
        return -1;
    }
    int size=lseek(sfd,0,SEEK_END);
    close(sfd);
    close(dfd);
    return size;
}
void *task1(void *copy){ //线程1copy获取前一半
    int sfd=open(((struct Copy *)copy)->src,O_RDONLY);
    if(sfd==-1){
        printf("open src err\n");
    }
    int dfd=open(((struct Copy *)copy)->des,O_WRONLY);
    if(dfd==-1){
        printf("open dfd err\n");
        
    }
    int len=((struct Copy *)copy)->len;
    lseek(sfd,0,SEEK_SET);
    lseek(dfd,0,SEEK_SET);
    char a;
    int num=0;
    while(num<len/2){
        read(sfd,&a,sizeof(a));
        write(dfd,&a,sizeof(a));
        num++;
    }
    close(sfd);
    close(dfd);
    pthread_exit(NULL);
}
void *task2(void *copy){//获取文件后一半
        int sfd=open(((struct Copy *)copy)->src,O_RDONLY);
        if(sfd==-1){
                printf("open src err\n");
                
        }
        int dfd=open(((struct Copy *)copy)->des,O_WRONLY);
        if(dfd==-1){
                printf("open dfd err\n");
                
        }
        int len=((struct Copy *)copy)->len;
        lseek(sfd,len/2,SEEK_SET);
        lseek(dfd,len/2,SEEK_SET);
        char a;
        while(1){
               int res=read(sfd,&a,sizeof(a));
           if(res==0){
               break;
           }
                write(dfd,&a,sizeof(a));
        }
    close(sfd);
        close(dfd);
        pthread_exit(NULL);
}
int main(int argc,const char *argv[]){
    if(argc!=3){ //判断文件个数
        printf("sending err\n");
        return -1;
    }
    int len=get_len(argv[1],argv[2]);
    struct Copy copy={len,argv[1],argv[2]};
    pthread_t tid1,tid2;         //创建线程
    if(pthread_create(&tid1,NULL,task1,&copy)!=0){
        printf("tid1 create err\n");
        return -1;
    }
    if(pthread_create(&tid2,NULL,task2,&copy)!=0){
                printf("tid2 create err\n");
                return -1;
        }
    pthread_join(tid1,NULL);//阻塞等待线程结束,回收资源
    pthread_join(tid2,NULL);
    return 0;
}

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值