- #include <myhead.h>
- typedef struct
- {
- const char *srcfile;
- const char *destfile;
- int len;
-
- }info;
-
- void *task1(void *arg)
- {
- info buf=*((info *)(arg));
- //打开这两个文件,只读的形式
- int fd=-1;
- if((fd=open(buf.srcfile,O_RDONLY))==-1)
- {
- perror("open error");
- return NULL;
- }
-
- //打开第二个文件,只写的形式
- int fd1=-1;
- if((fd1=open(buf.destfile,O_WRONLY))==-1)
- {
- perror("open error");
- return NULL;
- }
-
- //将光标移动到起始的位置
- lseek(fd,0,SEEK_SET);
- lseek(fd1,0,SEEK_SET);
-
- int sum=0;
- char c;
- while(1)
- {
- int res=read(fd,&c,1);
- sum+=res;
- if(sum<=(buf.len/2))
- {
- write(fd1,&c,res);
- }
- else
- {
- break;
- }
- }
- close(fd);
- close(fd1);
-
-
- //退出线程1
- pthread_exit(NULL);
-
- }
-
- void *task2(void *arg)
- {
- info buf=*((info *)(arg));
- //打开这两个文件,只读的形式
- int fd=-1;
- if((fd=open(buf.srcfile,O_RDONLY))==-1)
- {
- perror("open error");
- return NULL;
- }
-
- //打开第二个文件,只写的形式
- int fd1=-1;
- if((fd1=open(buf.destfile,O_WRONLY))==-1)
- {
- perror("open error");
- return NULL;
- }
- //移动光标
- lseek(fd,buf.len/2,SEEK_SET);
- lseek(fd1,buf.len/2,SEEK_SET);
-
- //将另一半进行拷贝
- char c;
-
- while(1)
- {
- int res=read(fd,&buf,1);
- //如果读取到文件末尾,或者读取错误的时候就退出
- if(res==0||res==-1)
- {
- break;
- }
- write(fd1,&buf,res);
- }
- close(fd);
- close(fd1);
-
-
-
- //退出线程2
- pthread_exit(NULL);
-
- }
-
- int main(int argc, const char *argv[])
- {
- if(argc!=3)
- {
- printf("input file error\n");
- printf("usage:./a.out srcfile destfile\n");
- return -1;
- }
-
- //计算文件的大小
- int fd=-1;
- if((fd=open(argv[1],O_RDONLY))==-1)
- {
- perror("open error");
- return -1;
- }
- int len=lseek(fd,0,SEEK_END);
- close(fd);
-
- //第二个文件
- int fd1=-1;
- if((fd1=open(argv[2],O_CREAT|O_RDWR|O_TRUNC,0664))==-1)
- {
- perror("open error");
- return -1;
- }
- //创建结构体变量并初始化
- info st={argv[1],argv[2],len};
-
- pthread_t tid1,tid2;
- //创建第一个线程
- if(pthread_create(&tid1,NULL,task1,&st)!=0)
- {
- perror("pthread_create error");
- return -1;
- }
- //创建第二个线程
- if(pthread_create(&tid2,NULL,task2,&st)!=0)
- {
- perror("pthread_create error");
- return -1;
- }
-
-
- //主线程用来回收另外两个线程
- pthread_join(tid1,NULL);
- pthread_join(tid2,NULL);
- return 0;
- }
运行结果:
