1、使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源
#include<myhead.h>
struct Buf
{
int start;//起始位置
int end;//结束位置
const char *arr;//源文件
const char *brr;//目标文件
};
//判断文件长度
int size(const char *arr,const char *brr)
{
//打开源文件
int pd1=-1;
if((pd1=open(arr,O_RDONLY))==-1)
{
perror("open error");
return -1;
}
//打开目标文件
int pd2=-1;
if((pd2=open(brr,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error");
return -1;
}
int size=lseek(pd1,0,SEEK_END);//求出pd1的文件字符数
close(pd1);
close(pd2);
return size;
}
void *task(void *arg)
{
//数据读取
int start=((struct Buf*)arg)->start;
int end=((struct Buf*)arg)->end;
const char *arr;
const char *brr;
arr=((struct Buf*)arg)->arr;
brr=((struct Buf*)arg)->brr;
//printf("%s\n",arr);
//打开源文件
int pd1=-1;
if((pd1=open(arr,O_RDONLY))==-1)
{
perror("open error");
pthread_exit(NULL);
}
//打开目标文件
int pd2=-1;
if((pd2=open(brr,O_WRONLY))==-1)
{
perror("open error");
pthread_exit(NULL);
}
//偏移位置
lseek(pd1, start, SEEK_SET);
lseek(pd2, start, SEEK_SET);
//定义搬运工
char buf[128]="";
//定义读取数量
int sum=start;
while(1)
{
int src=read(pd1,buf,sizeof(buf));//读取
sum+=src;//记录读取个数
if(src==0||sum>end)//退出条件
{
write(pd2,buf,src-sum+end);
break;
}
write(pd2,buf,src);
}
pthread_exit(NULL);
}
int main(int argc,const char *argv[])
{
//判断文件数量
if(argc!=3)
{
printf("input_file error\n");
return -1;
}
//判断文件长度
int len=size(argv[1],argv[2]);
printf("%d\n",len);
//将数据写入结构体内部
struct Buf buf1={0,len-len/2,argv[1],argv[2]};
struct Buf buf2={len/2,len,argv[1],argv[2]};
//创建线程1
pthread_t pid1=0;
if(pthread_create(&pid1,NULL,task,&buf1)!=0)
{
printf("pthread_create error\n");
return 0;
}
//创建线程2
pthread_t pid2=0;
if(pthread_create(&pid2,NULL,task,&buf2)!=0)
{
printf("pthread_create error\n");
return 0;
}
//分离
pthread_join(pid1,NULL);
pthread_join(pid2,NULL);
return 0;
}