IO编程--多线程实现文件拷贝
一、使用多线程完成两个文件的拷贝,分支线程1,拷贝前一半,分支线程2拷贝后一半,主线程用于回收分支线程的资源
代码如下:
#include <myhead.h> //打开文件函数 int open_file() {//打开要拷贝的文件int fd=open("information.txt",O_RDONLY);if(fd==-1){perror("original file open error");return -1;}//打开新文件int fp=open("copy_info.txt",O_WRONLY|O_CREAT|O_TRUNC,0664);if(fp==-1){perror("new file open error");return -1;}//获取原文件字节长度int len=lseek(fd,0,SEEK_END);close(fd);close(fp);return len; } //拷贝文件函数 void copy_file(int start,int len) {//打开文件int srcfd=open("information.txt",O_RDONLY);if(srcfd==-1){perror("old open error");return;}int destfd=open("copy_info.txt",O_WRONLY);if(destfd==-1){perror("new open error");return;}//光标定位到参数传递的读写开始处lseek(srcfd,start,SEEK_SET);lseek(destfd,start,SEEK_SET);char buf[20]=" ";int sum=0;while(1){//每次写入之前清空数组 避免脏数据bzero(buf,sizeof(buf));//读取数据int res=read(srcfd,buf,sizeof(buf));sum+=res;//到文件末尾或读取总字节大于一半的文件长度if(res==0||sum>=len){//将最后一次读取的数据写入write(destfd,buf,res-(sum-len));break;}//写入数据write(destfd,buf,res);}close(srcfd);close(destfd); } //线程1 void* sub_thread1(void *len) {//参数是一个任意类型指针 为了获取整型数据需要强转int res=*(int *)len;copy_file(0,res/2);printf("线程1拷贝完成\n");pthread_exit(NULL); } //线程2 void* sub_thread2(void *len) {int res=*(int *)len;//printf("%d\n",res);int num=res-(res/2);copy_file(res/2,num);printf("线程2拷贝完成\n");pthread_exit(NULL); } int main(int argc, const char *argv[]) {pthread_t tid1=-1,tid2=-1;//打开文件 计算长度int len=open_file();if(pthread_create(&tid1,NULL,sub_thread1,&len)!=0){printf("线程创建失败\n");return -1;}if(pthread_create(&tid2,NULL,sub_thread2,&len)!=0){printf("线程创建失败\n");return -1;}//主线程内容//使用多线程完成两个文件的拷贝//分支线程1拷贝前一半,分支线程2拷贝后一半//主线程用于回收分支线程的资源//阻塞等待两个线程结束 回收资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0; }
运行结果如图所示: