作业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;
}