使用两个线程完成两个文件的拷贝,分支线程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,©)!=0){
printf("tid1 create err\n");
return -1;
}
if(pthread_create(&tid2,NULL,task2,©)!=0){
printf("tid2 create err\n");
return -1;
}
pthread_join(tid1,NULL);//阻塞等待线程结束,回收资源
pthread_join(tid2,NULL);
return 0;
}