1、使用多线程完成两个文件的拷贝,第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程的资源
代码:
#include<myhead.h>//定义文件拷贝函数
int copy_file(int start,int len)
{int srcfd,destfd;//以只读的形式打卡源文件if((srcfd=open("./picture.bmp",O_RDONLY))==-1){perror("open srcfile error");return -1;}//以只写形式打开目标文件if((destfd=open("./cp.bmp",O_WRONLY|O_CREAT,0664))==-1){perror("open destfile error");return -1;}//移动光标lseek(srcfd,start,SEEK_SET);lseek(destfd,start,SEEK_SET);//进行拷贝char buf[128]="";int sum=0;while(1){int res=read(srcfd,buf,sizeof(buf));sum+=res; //每次读写的数据量放入到sum中//判断读取进度if(sum>=len||res==0){//写入最后一次内容write(destfd,buf,res-(sum-len));break;}//将数据放入目标文件write(destfd,buf,res);}//关闭文件close(srcfd);close(destfd);return 0;
}//定义分支线程
void *task2(void *arg)
{//分支线程从中间进行复制copy_file((*(int *)arg)/2,(*(int *)arg)-(*(int *)arg)/2);pthread_exit(NULL);}
void *task1(void *arg)
{//分支线程从头进行复制copy_file(0,(*(int *)arg)/2);pthread_exit(NULL);}int main(int argc, const char *argv[])
{//计算数据int fd=-1;if((fd=open("./picture.bmp",O_RDONLY))==-1){perror("open error");return -1;}int len=lseek(fd,0,SEEK_END);close(fd);//创建分支线程pthread_t tid1;if(pthread_create(&tid1,NULL,task1,&len)!=0){printf("tid1 creat error\n");return -1;}pthread_t tid2;if(pthread_create(&tid2,NULL,task2,&len)!=0){printf("tid2 creat error\n");return -1;}//回收资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);printf("copy success\n");return 0;
}
运行结果:
思维导图: