1>使用多线程完成两个文件的拷贝,第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程的资源
#include<myhead.h>
typedef struct Inof
{
const char*srcfile;
const char*destfile;
int start;
int len;
}inof;
int do_len(const char*srcfile)
{
FILE*fa=NULL;
if((fa=fopen(srcfile,"r"))==NULL)
{
perror("fa fopen error");
return -1;
}
fseek(fa,0,SEEK_END);
int len=ftell(fa);
fseek(fa,0,SEEK_SET);
fclose(fa);
return len;
}
int do_copy(const char*srcfile,const char* destfile,int start,int len)
{
FILE*fa=NULL;
FILE*fb=NULL;
if((fa=fopen(srcfile,"r"))==NULL)
{
perror("fa fopen error");
return -1;
}
if((fb=fopen(destfile,"w"))==NULL)
{
perror("fb fopen error");
return -1;
}
char buf;
int num=0;
fseek(fa,start,SEEK_SET);
fseek(fb,start,SEEK_SET);
while(1)
{
int rew=fread(&buf,1,sizeof(buf),fa);
num+=rew;
if( rew==0)
{
//fwrite(&buf,1,rew-(num-len),fb);
break;
}
fwrite(&buf,1,rew,fb);
}
fclose(fa);
fclose(fb);
return 0;
}
void* task1(void*arg)
{
inof buf=*((inof*)arg);
do_copy(buf.srcfile,buf.destfile,buf.start,buf.len);
}
void* task2(void*arg)
{
inof buf=*((inof*)arg);
do_copy(buf.srcfile,buf.destfile,buf.start,buf.len);
}
int main(int argc, const char *argv[])
{
if(argc!=3)
{
puts("enter file error");
return -1;
}
//源文件的文件大小
int len=do_len(argv[1]);
printf("len=%d\n",len);
inof sql1={argv[1],argv[2],0,len/2};
//线程1
pthread_t tid1=-1;
if(pthread_create(&tid1,NULL,task1,&sql1)!=0)
{
puts("tid1 pthread_create error");
return -1;
}
//线程2
pthread_t tid2=-1;
inof sql2={argv[1],argv[2],len-(len/2),len};
if(pthread_create(&tid2,NULL,task2,&sql2)!=0)
{
puts("tid2 pthread_create error");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
2>思维导图
文章来源地址https://www.toymoban.com/news/detail-834344.html
文章来源:https://www.toymoban.com/news/detail-834344.html
到了这里,关于day4 2/21的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!