思维导图
练习
使用多线程拷贝同一份文件,线程1拷贝前一半,线程2拷贝后一半,主线程阻塞等待回收子线程的资源
源代码
#include <myhead.h>
typedef struct
{
const char *srcfile;
const char *destfile;
int start;
int length;
}COPY;
int get_len(const char *srcfile, const char *destfile)
{
//定义两个文件描述符
int fd_src, fd_dest;
//以只读的形式打开文件
if((fd_src = open(srcfile, O_RDONLY)) == -1)
{
perror("open file");
return -1;
}
//以读写的形式打开文件
if((fd_dest = open(destfile, O_RDWR|O_CREAT|O_TRUNC, 0664)) == -1)
{
perror("open file");
return -1;
}
//求源文件大小
int len = lseek(fd_src, 0, SEEK_END);
//关闭两个文件
close(fd_src);
close(fd_dest);
return len;
}
//定义拷贝函数
int copy_file(const char *srcfile, const char *destfile, int start, int len)
{
//定义两个文件描述符
int fd_src, fd_dest;
//以只读的形式打开文件
if((fd_src = open(srcfile, O_RDONLY)) == -1)
{
perror("open file");
return -1;
}
//以读写的形式打开文件
if((fd_dest = open(destfile, O_RDWR, 0664)) == -1)
{
perror("open file");
return -1;
}
//定义两个文件的光标
lseek(fd_src, start, SEEK_SET);
lseek(fd_dest, start, SEEK_SET);
//拷贝工作 内容搬运工
char buf[128];
int ret = 0,bet;
int count = 0; //记录读取个数
while(1)
{
//从源文件中读取数据
ret = read(fd_src, buf, sizeof(buf));
count += ret; //将读取的个数累加
if(ret == 0 || count > len)
{
write(fd_dest, buf, ret-(count-len));
break;
}
//将读取下来的内容写到新文件中去
write(fd_dest, buf, ret);
}
close(fd_src);
close(fd_dest);
return 0;
}
//线程1拷贝前一半文件 线程2拷贝后一半文件
void *task(void *arg)
{
COPY *argv = (COPY *)arg;
copy_file(argv->srcfile, argv->destfile, argv->start, argv->length);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//对参数个数进行判断
if(argc != 3)
{
printf("file count error\n");
printf("urage:./a.out srcfile destfile\n");
return -1;
}
int len = get_len(argv[1], argv[2]);
COPY file1 = {argv[1], argv[2], 0, len/2};
COPY file2 = {argv[1], argv[2], len/2, len-len/2};
//定义两个线程
pthread_t tid1,tid2;
//创建两个线程
if(pthread_create(&tid1, NULL, task, &file1))
{
perror("create tid1");
return -1;
}
if(pthread_create(&tid2, NULL, task, &file2))
{
perror("create tid2");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}