1.使用两个线程完成两个文件的拷贝,分支线程1完成前一半内容拷贝,分支线程2完成后一半内容的拷贝,主线程完成资源的回收
#include <head.h>
int get_len_create(const char*srcfile,const char *dstfile);
int file_copy(const char*srcfile , const char*dstfile,int start,int len);
//定义一个传参结构体
struct Info
{
const char *srcfile;
const char *dstfile;
int start;
int len;
};
//分支线程1
void *cp1(void *arg)
{
//接收结构体参数
struct Info buf1 = *((struct Info*)arg);
//拷贝上半部分
file_copy(buf1.srcfile,buf1.dstfile,buf1.start,buf1.len);
printf("上半部分拷贝成功\n");
//关闭分支线程1
pthread_exit(NULL);
}
//分支线程2
void *cp2(void *arg)
{
//接收结构体参数
struct Info buf2 = *((struct Info*)arg);
//拷贝上半部分
file_copy(buf2.srcfile,buf2.dstfile,buf2.start,buf2.len);
printf("下半部分拷贝成功\n");
//关闭分支线程1
pthread_exit(NULL);
}
/********主线程**********/
int main(int argc, const char *argv[])
{
//判断终端输入文件个数
if(argc != 3)
{
printf("input file error\n");
printf("usage:a.out srcfile dstfile\n");
return -1;
}
//定义函数计算长度和创建目标文件
int len = get_len_create(argv[1],argv[2]);
struct Info buf1 ={argv[1],argv[2],0,len/2};
struct Info buf2 ={argv[1],argv[2],len/2,len-len/2};
//定义两个线程号
pthread_t tid1 = -1;
pthread_t tid2 = -1;
//创建两个线程
if(pthread_create(&tid1,NULL,cp1,&buf1) != 0)
{
printf("tid1 create error\n");
return -1;
}
if(pthread_create(&tid2,NULL,cp2,&buf2) != 0)
{
printf("tid2 create error\n");
return -1;
}
//阻塞回收线程资源
pthread_join(tid1,NULL);
pthread_join(tid1,NULL);
printf("拷贝成功\n");
return 0;
}
//计算长度函数
int get_len_create(const char*srcfile,const char *dstfile)
{
int srcfd,dstfd;
//只读打开srcfile
if((srcfd = open(srcfile,O_RDONLY)) == -1)
{
perror("open src error");
return -1;
}
//读写打开dstfile
if((dstfd = open(dstfile,O_RDWR|O_CREAT|O_TRUNC,0664)) == -1)
{
perror("open dst error");
return -1;
}
int len = lseek(srcfd,0,SEEK_END);
//关闭文件
close(srcfd);
close(dstfd);
return len;
}
//拷贝函数
int file_copy(const char*srcfile , const char*dstfile,int start,int len)
{
int srcfd,dstfd;
//只读打开srcfile
if((srcfd = open(srcfile,O_RDONLY)) == -1)
{
perror("open src error");
return -1;
}
//写打开dstfile
if((dstfd = open(dstfile,O_WRONLY)) == -1)
{
perror("open dst error");
return -1;
}
//光标定位到相同位置
lseek(srcfd,start,SEEK_SET);
lseek(dstfd,start,SEEK_SET);
char buf[128] = ""; //定义读取容器
int res = 0;
int sum = 0;
//开始拷贝
while(1)
{
res = read(srcfd,buf,sizeof(buf));
sum += res;
if(sum >= len || res ==0)
{
write(dstfd,buf,res-(sum-len));
break;
}
write(dstfd,buf,res);
}
close(srcfd);
close(dstfd);
return 0;
}
2.思维导图