作业1:使用多线程完成两个文件的拷贝
要求:第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程的资源
代码:
#include <myhead.h>
//定义结构体
typedef struct Info
{
char *src;
char *dest;
int s;
int l;
}IF_t;
//定义函数求文件大小
int sizefile(const char *srcfile,const char *destfile)
{
//定义两个文件描述符
int srcfd,destfd;
//以只读形式打开源文件
if((srcfd=open(srcfile,O_RDONLY))==-1){
perror("open error");
return -1;
}
//以只写创建的形式打开目标文件
if((destfd=open(destfile,O_WRONLY | O_CREAT | O_TRUNC,0664))==-1){
perror("open error");
return -1;
}
//求源文件大小
int len=lseek(srcfd,0,SEEK_END);
//关闭两个文件
close(srcfd);
close(destfd);
return len;
}
//定义拷贝函数
int copy_file(const char *srcfile,const char *destfile,int start,int len)
{
//定义源文件与目标文件的文件描述符
int srcfd,destfd;
//以只读形式打开源文件
if((srcfd=open(srcfile,O_RDONLY))==-1){
perror("open error");
return -1;
}
//以只写形式打开目标文件
if((destfd=open(destfile,O_WRONLY))==-1){
perror("open error");
return -1;
}
//移动文件光标
lseek(srcfd,start,SEEK_SET);
lseek(destfd,start,SEEK_SET);
//拷贝文件
char buf[128]="";
int size=0;
int res=0;
while(1)
{
res=read(srcfd,buf,sizeof(buf));
size += res; //size存储每次读取的字符数
if(size>=len/2 || res==0){
write(destfd,buf,res-(size-len));
break;
}
write(destfd,buf,res);
}
//关闭文件
close(srcfd);
close(destfd);
return 0;
}
/**********************第一个分支线程*************************/
void *task1(void *arg)
{
IF_t buf=*((IF_t *)arg);
copy_file(buf.src,buf.dest,buf.s,buf.l);
//退出分支线程
pthread_exit(NULL);
}
/*********************第二个分支线程*************************/
void *task2(void *arg)
{
IF_t buf=*((IF_t *)arg);
copy_file(buf.src,buf.dest,buf.s,buf.l);
//退出分支线程
pthread_exit(NULL);
}
/************************主线程******************************/
int main(int argc, const char *argv[])
{
//要传递给分支进程的数据
char *srcfilename="./temp.txt";
char *destfilename="./test.txt";
int len=sizefile("./temp.txt","test.txt");
//定义结构体数组变量
IF_t buf[2]={{srcfilename,destfilename,0,len/2},\
{srcfilename,destfilename,len/2,len-len/2}};
//定义线程号变量
pthread_t tid1,tid2;
//创建两个线程
if(pthread_create(&tid1,NULL,task1,&buf[0])!=0){
printf("create tid1 error\n"); //第一个分支线程拷贝文件前一半部分
return -1;
}
if(pthread_create(&tid2,NULL,task2,&buf[1])!=0){
printf("create tid1 error\n"); //第二个分支线程拷贝文件后一半部分
return -1;
}
//回收分支线程资源
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
printf("分支线程回收成功\n");
printf("文件拷贝成功\n");
return 0;
}
效果图: