作业
使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源
typedef struct Copy //定义复制函数结构体
{
char *srcfile;
char *destfile;
int start;
int len;
int flag;
}Copy,*CopyPtr;
#include<myhead.h>
int get_file_len(const char *srcfile,const char *destfile)
{
//以只读形式打开源文件
int sfd=open(srcfile,O_RDONLY);
if(sfd==-1)
{
perror("open srcfile error");
return -1;
}
//以创建的形式打开目标文件
int dfd=open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664);
if(dfd==-1)
{
perror("open destfile error");
return -1;
}
int size=lseek(sfd,0,SEEK_END);
//关闭文件
close(sfd);
close(dfd);
return size; //返回文件大小
}
void *copy(void *arg)
{
//判断传来的信息
if(((CopyPtr)arg)->flag==1)
{
//是1号线程,完成前半段拷贝
//以只读的形式打开源文件
int sfd = open(((CopyPtr)arg)->srcfile, O_RDONLY);
if(sfd == -1)
{
perror("open srcfile error");
}
//以创建的形式打开目标文件
int dfd = open(((CopyPtr)arg)->destfile, O_WRONLY);
if(dfd == -1)
{
perror("open destfile error");
}
//移动光标位置
lseek(sfd,((CopyPtr)arg)->start , SEEK_SET);
lseek(dfd,((CopyPtr)arg)->start, SEEK_SET);
//定义搬运工
char buf[128] = "";
int sum = 0; //记录拷贝的总个数
while(1)
{
//从源文件中读取数据
int res = read(sfd, buf, sizeof(buf));
sum += res; //将读取的个数累加
if(res == 0 || sum>((CopyPtr)arg)->len) //表示文件读取结束
{
write(dfd, buf, res-(sum-((CopyPtr)arg)->len)); //父进程将最后一次拷贝结束
break;
}
//写入到目标文件中
write(dfd, buf, res);
}
//关闭文件
close(sfd);
close(dfd);
printf("拷贝成功\n");
pthread_exit(NULL);
}else if(((CopyPtr)arg)->flag==2)
{
//以只读的形式打开源文件
int sfd = open(((CopyPtr)arg)->srcfile, O_RDONLY);
if(sfd == -1)
{
perror("open srcfile error");
}
//以创建的形式打开目标文件
int dfd = open(((CopyPtr)arg)->destfile, O_WRONLY);
if(dfd == -1)
{
perror("open destfile error");
}
//移动光标位置
lseek(sfd, ((CopyPtr)arg)->start, SEEK_SET);
lseek(dfd, ((CopyPtr)arg)->start, SEEK_SET);
//定义搬运工
char buf[128] = "";
int sum = 0; //记录拷贝的总个数
while(1)
{
//从源文件中读取数据
int res = read(sfd, buf, sizeof(buf));
sum += res; //将读取的个数累加
if(res == 0 || sum>((CopyPtr)arg)->len) //表示文件读取结束
{
write(dfd, buf, res-(sum-((CopyPtr)arg)->len)); //父进程将最后一次拷贝结束
break;
}
//写入到目标文件中
write(dfd, buf, res);
}
//关闭文件
close(sfd);
close(dfd);
printf("拷贝成功\n");
pthread_exit(NULL);
}
}
int main(int argc, const char *argv[])
{
//判断是否传入两个文件
if(argc!=3)
{
printf("input file error\n");
return -1;
}
//求源文件长度
int len= get_file_len(argv[1],argv[2]);
char *srcfile=strdup(argv[1]);
char *destfile=strdup(argv[2]);
Copy cp1={srcfile,destfile,0,len/2,1};
Copy cp2={srcfile,destfile,len/2,len-len/2,2};
//定义线程变量
pthread_t tid1,tid2;
//创建两个线程
if(pthread_create(&tid1,NULL,copy,&cp1)!=0)
{
printf("tid1 创建失败\n");
return -1;
}
if(pthread_create(&tid2,NULL,copy,&cp2)!=0)
{
printf("tid2 创建失败\n");
return -1;
}
//阻塞等线程结束
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}