线程完成拷贝:
#include <myhead.h>
//定义一个结构体
struct info
{
const char *srcfile;
const char *destfile;
int start;
int size;
};
//len
int file_len(const char *srcfile,const char *destfile)
{
int sfd,dfd,len;
if((sfd = open(srcfile,O_RDONLY)) == -1)
{
perror("open error");
return -1;
}
if((dfd = open(destfile,O_WRONLY | O_CREAT | O_TRUNC),0664) == -1)
{
perror("open error");
return -1;
}
len = lseek(sfd,0,SEEK_END);
close(sfd);
close(dfd);
return len;
}
//线程体
void *file_copy(void *sp)
{
struct info *arg=(struct info *)sp;
int sfd,dfd;
if((sfd = open(arg->srcfile,O_RDONLY)) == -1)
{
perror("open error");
}
if((dfd = open(arg->destfile,O_WRONLY)) == -1)
{
perror("open error");
}
lseek(sfd,arg->start,SEEK_SET);
lseek(dfd,arg->start,SEEK_SET);
char buf[256]="";
int count = 0;
while(1)
{
int ret = read(sfd,buf,sizeof(buf));
count+=ret;
if(ret == 0 || count > arg->size)
{
write(dfd,buf,ret - (count - arg->size));
break;
}
write(dfd,buf,sizeof(buf));
}
}
int main(int argc, const char *argv[])
{
//长度
int len;
len = file_len(argv[1],argv[2]);
printf("len = %d\n",len);
//定义一个结构体数组
struct info s[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,len-len/2}};
//定义一个线程号
pthread_t tid,tid1;
//线程1
if(pthread_create(&tid,NULL,file_copy,&s[0]))
{
perror("create error");
return -1;
}
//线程2
if(pthread_create(&tid1,NULL,file_copy,&s[1]))
{
perror("create error");
return -1;
}
while(1);
return 0;
}
IO DAY5
最新推荐文章于 2024-10-06 20:16:20 发布
该程序定义了一个结构体用于存储源文件、目标文件路径及拷贝范围,实现了一个函数计算文件长度,以及一个线程函数进行文件拷贝。在主函数中,根据输入参数创建两个线程,分别拷贝文件的一半内容,实现了文件的并行分段复制。
摘要由CSDN通过智能技术生成