1、使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源
代码
#include<myhead.h>
//定义结构体,用来传送文件名
struct File
{
char file1[20]; //用来保存原文件名
char file2[20]; //用来保存目标文件名
};
//定义计算长度函数,返回源文件的长度
int getlen(char *file1,char *file2)
{
int sfd = -1;
if((sfd = open(file1,O_RDONLY))==-1) //以只读的形式打开源文件
{
perror("open error");
return -1;
}
int dfd = -1;
if((dfd = open(file2,O_RDONLY))==-1) //以只读的形式打开目标文件
{ //如果文件打不开说明目标文件没有创建,则创建目标文件,两个if防止两个线程都创建并且清空了目标文件
if((dfd = open(file2,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error");
}
}
int size = lseek(sfd,0,SEEK_END); //计算长度
close(sfd); //关闭源文件
close(dfd); //关闭目标文件
return size;
}
/******************************task1********************************/
//用来执行读取前一半内容任务的线程
void *task1(void *arg)
{
//获取源文件的长度
int len = getlen(((struct File*)arg)->file1,((struct File*)arg)->file2);
int sfd = -1;
//只读形式打开源文件
if((sfd = open(((struct File*)arg)->file1,O_RDONLY))==-1)
{
perror("open error");
return NULL;
}
int dfd = -1;
//只写形式打开目标文件
if((dfd = open(((struct File*)arg)->file2,O_WRONLY))==-1)
{
perror("open error");
return NULL;
}
lseek(sfd,0,SEEK_SET); //将光标定位到源文件开头
lseek(dfd,0,SEEK_SET); //将光标定位到目标文件开头
char buf[2] = ""; //定义一个容器用以搬移
int count = 0; //计数
while(count < len/2) //读写源文件前一半内容
{
int res = read(sfd,buf,sizeof(buf)-1);
write(dfd,buf,res);
count++;
}
//关闭文件
close(sfd);
close(dfd);
}
/*******************************task2*******************************/
//读取后一半内容任务的线程
void *task2(void *arg)
{
//获取源文件的长度
int len = getlen(((struct File*)arg)->file1,((struct File*)arg)->file2);
int sfd = -1;
//以只读的形式打开源文件
if((sfd = open(((struct File*)arg)->file1,O_RDONLY))==-1)
{
perror("open error");
return NULL;
}
int dfd = -1;
//以只写形式打开目标文件
if((dfd = open(((struct File*)arg)->file2,O_WRONLY))==-1)
{
perror("open error");
return NULL;
}
//将光标定位到源文件内容一半的位置
lseek(sfd,len/2,SEEK_SET);
lseek(dfd,len/2,SEEK_SET);
char buf[2] = ""; //定义一个容器用以搬移
int res = 0; //用来存储正确读取到的个数
while( res = read(sfd,buf,sizeof(buf)-1)!=0)
{
write(dfd,buf,res);
}
//关闭文件
close(sfd);
close(dfd);
}
/****************主程序**************************/
int main(int argc, const char *argv[])
{
//判断输入有无两个文件
if(argc!=3)
{
printf("input file error\n");
return -1;
}
struct File file; //定义一个结构体
strcpy(file.file1,argv[1]); //把源文件名传入结构体
strcpy(file.file2,argv[2]); //把目标文件名传入结构体
pthread_t tid1,tid2; //创建两个线程
if(pthread_create(&tid1,NULL,task1,&file)!=0)
{
printf("tid1创建失败\n");
}
if(pthread_create(&tid2,NULL,task2,&file)!=0)
{
printf("tid2创建失败\n");
}
//回收进程
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
效果图