#include <myhead.h>
typedef struct {
const char *srcfile;
const char *dstfile;
int start;
int size;
}File;
void *cp_file(const char *srcfile,const char *dstfile,int start,int size){
//定义两个文件描述符
int sfd,dfd;
if((sfd=open(srcfile,O_RDONLY))==-1){
perror("open srcfile error");
return NULL;
}
if((dfd=open(dstfile,O_WRONLY))==-1){
perror("open dstfile error");
return NULL;
}
//光标偏移
lseek(sfd,start,SEEK_SET);
lseek(dfd,start,SEEK_SET);
//完成拷贝功能
char buf[128]="";
int count=0;
int ret=-1;
for(;count<=size && ret!=0;){
ret =read(sfd,buf,sizeof(buf));
write(dfd,buf,ret); //将读取的数据写入第二个文件中
count+=ret;
}
close(sfd);
close(dfd);
}
//计算文件大小
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){
File f=*(File *)arg;
cp_file(f.srcfile,f.dstfile,f.start,f.size);
pthread_exit(NULL);
}
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]);
//结构体
File s[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,len/2}};
pthread_t tid1,tid2; //定义线程号
//创建线程
if(pthread_create(&tid1,NULL,task,(void *)&s[0])){
perror("create error");
return -1;
}
if(pthread_create(&tid2,NULL,task,(void *)&s[1])){
perror("create error");
return -1;
}
printf("拷贝成功\n");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
IO-day5
最新推荐文章于 2024-08-06 00:00:00 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)