1、思维导图
2、使用多线程拷贝同一份文件,线程1拷贝前一半,线程2拷贝后一半,主线程阻塞等待回收子线程的资源
#include<myhead.h>
#include<sys/wait.h>
int get_len(const char *srcfile, const char *destfile)
{
int fd1,fd2;
if((fd1 == open(srcfile,O_RDONLY)) == -1)
{
perror("open srcfile error");
return -1;
}
if((fd2 == open(destfile,O_RDONLY|O_CREAT|O_TRUNC,0664)) == -1)
{
perror("open destfile error");
return -1;
}
int len = lseek(fd1, 0, SEEK_END);
close(fd1);
close(fd2);
return len;
}
int copy_file(const char *srcfile, const char *destfile, int start, int len)
{
int fd1,fd2;
if((fd1 == open(srcfile, O_RDONLY)) == -1)
{
perror("open srcfile error");
return -1;
}
if((fd2 == open(destfile, O_RDWR)) == -1)
{
perror("open destfile error");
return -1;
}
lseek(fd1, start, SEEK_SET);
lseek(fd2, start, SEEK_SET);
char buf[1000] = "";
int ret = 0,count = 0;
while(1)
{
ret = read(fd1, buf, sizeof(buf));
count += ret;
if(ret == 0||count >len)
{
write(fd2, buf, ret - (count - len) );
break;
}
write(fd2, buf, ret);
}
close(fd1);
close(fd2);
return 0;
}
void *task1(void *arg)
{
int len = get_len("./work.txt","./work1.txt");
copy_file("./work.txt","./work1.txt",0,len/2);
pthread_exit(NULL);
}
void *task2(void *arg)
{
int len = get_len("./work.txt","./work2.txt");
copy_file("./work.txt","./work1.txt",len/2,len-len/2);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
pthread_t tid1,tid2;
if(pthread_create(&tid1, NULL, task1, NULL))
{
perror("create error");
return -1;
}
if(pthread_create(&tid2, NULL, task2, NULL))
{
perror("create error");
return -1;
}
pthread_detach(tid1);
pthread_detach(tid2);
return 0;
}