1.使用两个线程完成文件的拷贝,分支线程1拷贝文件前一半内容,分支线程2拷贝文件后一半内容,主线程完成资源回收
代码实现:
#include <head.h>
typedef struct
{
const char *src;
const char *dest;
int start;
int len;
}info_t;
int get_src_file_len(const char *srcfile,const char *destfile)
{
int sfd,dfd;
int len=0;
sfd=open(srcfile,O_RDONLY);
dfd=open(destfile,O_RDWR|O_CREAT|O_TRUNC,0664);
len=lseek(sfd,0,SEEK_END);
close(sfd);
close(dfd);
return len;
}
int copy_file(const char *srcfile,const char *destfile,int start,int len)
{
int sfd,dfd;
char buf[128]="";
int ret=0,count=0;
sfd=open(srcfile,O_RDONLY);
dfd=open(destfile,O_RDWR);
lseek(sfd,start,SEEK_SET);
lseek(dfd,start,SEEK_SET);
while(1)
{
ret=read(sfd,buf,sizeof(buf));
count+=ret;
if(ret==0 || count>len)
{
write(dfd,buf,ret-(count-len));
break;
}
write(dfd,buf,ret);
}
close(sfd);
close(dfd);
return 0;
}
void *task(void *arg)
{
//分支线程1-----拷贝文件前半部分
info_t buf=*(info_t *)arg;
copy_file(buf.src,buf.dest,buf.start,buf.len);
//退出线程
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//使用两个线程完成文件的拷贝,分支线程1完成前一半内容拷贝,
//分支线程2完成后一半内容拷贝,主线程完成资源的回收
//定义两个线程号存储变量
pthread_t tid1,tid2;
int len;
if(argc != 3)
{
printf("input error,try again\n");
printf("usage:./a.out srcfile destfile\n");
return -1;
}
len=get_src_file_len(argv[1],argv[2]); //获取要拷贝文件的大小
info_t buf[2]={
{argv[1],argv[2],0,len/2},
{argv[1],argv[2],len/2,(len-len/2)},
};
pthread_create(&tid1,NULL,task,(void*)&buf[0]); //创建分支线程1
pthread_create(&tid2,NULL,task,(void*)&buf[1]); //创建分支线程2
//回收分支线程资源
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
效果: