#include <myhead.h>
//定义结构体
struct Info
{
const char *srcfile;
const char *dstfile;
int start;
int size;
};
/*
* function: 求文件大小
* @param [ in]
* @param [out] 原文件,复制文件
* @return 返回文件大小
*/
int file_len(const char *srcfile,const char *dstfile)
{
//创建文件描述符
int sfd,dfd;
//以只读打开原文件
if ((sfd = open(srcfile,O_RDONLY)) == -1)
{
perror("open srcfile error");
return -1;
}
//以创建的形式打开第二个文件
if ((dfd = open(dstfile,O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)
{
perror("open dstfile error");
return -1;
}
//求出文件大小
int len = lseek(sfd,0,SEEK_END);
//关闭文件
close(sfd);
close(dfd);
//返回文件大小
return len;
}
void *task(void *arg)
{
//创建结构体变量指向线程体参数
struct Info *p = (struct Info *)arg;
//定义文件描述符
int sfd,dfd;
//以只读的形式打开第一个文件
if ((sfd = open(p->srcfile,O_RDONLY)) == -1)
{
perror("open srcfile error");
return NULL;
}
//以只写的形式打开第二个文件
if ((dfd = open(p->dstfile,O_WRONLY)) == -1)
{
perror("open dstfile error");
return NULL;
}
//移动光标
lseek(sfd,p->start,SEEK_SET);
lseek(dfd,p->start,SEEK_SET);
//定义容器
char buf[128];
int count = 0;
while (1)
{
//读取内容放入buf中
int ret = read(sfd,buf,sizeof(buf));
//统计拷贝的总量
count += ret;
//通过判断,最后一次正好读取完或者读取的总量大于原大小
if (0 == ret || count >= p->size)
{
//将最后一部分写入目标文件
write(dfd,buf,ret-(count-p->size));
break;
}
//正常读取的内容写入目标文件
write(dfd,buf,ret);
}
//关闭文件
close(sfd);
close(dfd);
}
int main(int argc, const char *argv[])
{
//判断文件个数
if (argc != 3)
{
printf("input file error\n");
printf("usage:./a.out srcfile dstfile\n");
return -1;
}
int len = file_len(argv[1],argv[2]);
//定义结构体变量
struct Info s[2] = {{argv[1],argv[2],0,len/2},
{argv[1],argv[2],len/2,len-len/2}};
//定义线程号
pthread_t tid1;
if (pthread_create(&tid1,NULL,task,&s[0]))
{
perror("create tid1 error");
return -1;
}
pthread_t tid2;
if (pthread_create(&tid2,NULL,task,&s[1]))
{
perror("create tid2 error");
return -1;
}
while(1);
return 0;
}
IODAY5
于 2023-06-27 21:14:16 首次发布