使用多线程实现2个文件的拷贝
#include <myhead.h>
struct Info
{
const char *src; //源文件
const char *dst;
int start;
int len; //长度
};
int file_len(const char *srcfile,const char *dstfile)
{
int fd1,fd2;
//定义文件描述符以只读形式打开
if((fd1=open(srcfile,O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
if((fd2=open(dstfile,O_RDWR | O_CREAT | O_TRUNC, 0666))==-1)
{
perror("open dstfile error");
return -1;
}
int len=lseek(fd1,0,SEEK_END); //定位光标确定拷贝的起始位置
close(fd1);
close(fd2);
return len;
}
//定义子线程线程体
void *task(void *arg) //void *arg 万能指针
{
//printf("我是子线程\n");
struct Info *n=(struct Info *)arg;
int fd1=open(n->src,O_RDONLY); //定义文件描述符以只读形式打开
int fd2=open(n->dst,O_RDWR); //定义文件描述符以读写形式打开
if(fd1==-1 || fd2==-1)
{
perror("open error");
return NULL;
}
char buf[128]=""; //定义一个容器存放读取的数据
int ret; //记录每次读取的个数
int count=0;
//将光标偏移到start处
lseek(fd1,n->start,SEEK_SET); //定位光标确定拷贝的起始位置
lseek(fd2,n->start,SEEK_SET);
while(1) //从fd1文件中读取数据存到buf中
{
ret=read(fd1,buf,sizeof(buf));
count+=ret;
if(ret==0 || count>=n->len)
{
write(fd2,buf,ret-(count-n->len));
break;
}
write(fd2,buf,ret); //将读取的数据存储到fd2中
}
close(fd1);
close(fd2);
}
int main(int argc, const char *argv[])
{
//定义一个线程号
pthread_t tid1,tid2;
//1.检查文件个数是否为3
if(argc!=3)
{
printf("输入的文件错误\n");
printf("usage:./a.out srcfile dstfile");
return -1;
}
//2. 获取文件长度
int len=file_len(argv[1],argv[2]);
//3.创建线程,使用多线程拷贝
struct Info s[2]={{argv[1],argv[2],0,len/2},\
{argv[1],argv[2],len/2,len-len/2}};
if(pthread_create(&tid1,NULL,task,&s[0]))
{
perror("create error");
return -1;
}
if(pthread_create(&tid2,NULL,task,&s[1]))
{
perror("create error");
return -1;
}
printf("拷贝成功\n");
while(1); //阻塞不让进程结果
return 0;
}
运行结果如下:
ubuntu@ubuntu:day5$ gcc 12pthread.c -pthread
ubuntu@ubuntu:day5$ ./a.out 01fork.c bb.c
拷贝成功
^C
ubuntu@ubuntu:day5$ diff 01fork.c bb.c