一、思维导图
二、习题
使用多线程完成两个文件的拷贝,第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程的资源
#include <myhead.h>
//复制文件函数
int copy(int start,int size)
{
int fd; //创建被读文件标识符
if((fd=open("./1.c",O_RDONLY))==-1)
{
perror("error");
return -1;
}
int fd_copy; //创建目标文件标识符
if((fd_copy=open("./text.c",O_WRONLY|O_CREAT,0664))==-1)
{
perror("error");
return -1;
}
//移动光标
lseek(fd,start,SEEK_SET);
lseek(fd_copy,start,SEEK_SET);
int count=0;
int res;
char str[128]="";
while(read(fd,str,sizeof(str)))
{
count+=strlen(str);
if( count>=size || strlen(str)==0)
{
write(fd_copy,str,strlen(str)-(count-size));
break;
}
write(fd_copy,str,strlen(str));
}
close(fd);
close(fd_copy);
return 0;
}
//线程1
void *pth1(void *arg)
{
//调用复制函数,从开头复制
copy(0,*((int*)arg));
pthread_exit(NULL);
}
//线程2
void *pth2(void *arg)
{
//调用复制函数
copy((*(int *)arg)/2,(*(int *)arg)/2);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//定义线程号
pthread_t tid1=-1;
pthread_t tid2=-1;
//计算统计结构体的数据
int fd=-1; //创建被读文件标识符
if((fd=open("./1.c",O_RDONLY))==-1)
{
perror("error");
return -1;
}
//计算复制文件尺寸
int size=lseek(fd,0,SEEK_END);
close(fd);
//创建分支线程1
if(pthread_create(&tid1,NULL,pth1,&size)!=0)
{
printf("ERROR");
return -1;
}
if(pthread_create(&tid2,NULL,pth2,&size)!=0)
{
printf("ERROR");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
printf("复制成功\n");
return 0;
}
现象