双线程拷贝图片
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <pthread.h>
typedef struct FileInfor //定义结构体,批量向线程中传递信息
{
char suorcefile[32]; //要拷贝的文件名
char destfile[32]; //要拷贝到的文件名
ssize_t len; //文件内容长度
ssize_t Start; //拷贝起始位置
}FileTyp;
ssize_t Get_Len(const char *suorcefile,const char *destfile)
{
int fd1,fd2;
ssize_t len;
if((fd1=open(suorcefile,O_RDONLY))==-1) //只读形式打开第一个文件
{
perror("open file");
return -1;
}
if((fd2=open(destfile,O_RDWR|O_CREAT|O_TRUNC,0666))==-1)//读写形式打开第二个文件
{
perror("open file");
return -1;
}
len=lseek(fd1,0,SEEK_END); //获得文件内容长度
close(fd1); //关闭文件
close(fd2);
return len;
}
int Cpy_File(const char *suorcefile,const char *destfile,ssize_t Start_Num,ssize_t len)
{
int fd1,fd2;
if((fd1=open(suorcefile,O_RDONLY))==-1) //只读形式打开第一个文件
{
perror("open file");
return -1;
}
if((fd2=open(destfile,O_RDWR))==-1)//读写形式打开第二个文件
{
perror("open file");
return -1;
}
lseek(fd1,Start_Num,SEEK_SET); //置位光标位置至起始位置
lseek(fd2,Start_Num,SEEK_SET);
char Buf[32]=""; //用于临时存数据
char n;
while(len>0) //拷贝完成条件
{
n=read(fd1,Buf,sizeof(Buf)); //返回每次读取的字节数
write(fd2,Buf,n); //写入相应的字节数
len=len-n; //拷贝总长减去每次拷贝的字节数
}
close(fd1); //关闭文件
close(fd2);
return 0;
}
void *task1(void *arg) //线程1,拷贝后半段
{
FileTyp *p=(FileTyp *)arg;
Cpy_File(p->suorcefile,p->destfile,p->Start,p->len);
pthread_exit(NULL);
}
void *task2(void *arg) //线程2,拷贝前半段
{
FileTyp *p=(FileTyp *)arg;
Cpy_File(p->suorcefile,p->destfile,p->Start,p->len);
pthread_exit(NULL);
}
int main()
{
ssize_t len,ret;
len=Get_Len("long.jpg","Text.jpg"); //获取文件内容长度
printf("file size : %ld\n",len);
ret=len/2-(len/2)%32; //计算前半段长度,为数组的整数倍
FileTyp CpyFork1={"long.jpg","Text.jpg",len-ret,ret};//分两段拷贝,填入两个文件名,
FileTyp CpyFork2={"long.jpg","Text.jpg",ret,0}; //拷贝的起始位置和长度
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,task1,&CpyFork1)==-1) //初始化进程1
{
perror("create tid error");
return -1;
}
if(pthread_create(&tid2,NULL,task2,&CpyFork2)==-1) //初始化进程2
{
perror("create tid error");
return -1;
}
pthread_join(tid1,NULL); //等待回收进程资源
pthread_join(tid2,NULL);
return 0;
}