IO:多线程实现文件拷贝

1.多线程实现两个文件拷贝,第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程资源

程序代码:

  1 #include<myhead.h>
  2 //定义要传递的结构体类型
  3 typedef struct
  4 {
  5     const char *src;//原文件地址
  6     const char *dest;//目标文件地址
  7     int start;//光标起始位置
  8     int len;//拷贝长度
  9 }Bran;
 10 int get_len(const char *srcfile,const char *destfile);
 11 int copy_file(const char *srcfile,const char *destfile,int start,int len);
 12 void *task(void *arg);
 13 int main(int argc, const char *argv[])
 14 {
 15     //判断外部传参个数
 16     if(argc!=3)
 17     {
 18         printf("input error\n");
 19         printf("usage:./a.out srcfile destfile\n");
 20         return -1;
 21     }
 22     //定义变量获取文件长度
 23     int len=get_len(argv[1],argv[2]);
 24     //定义线程号变量
 25     pthread_t tid1,tid2;
 26     //定义结构体数组存储,分支进程需要的参数
 27     Bran t[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,(len-len/2)}};
 28     //创建两个线程
 29     if(pthread_create(&tid1,NULL,task,(void*)&t[0])!=0)
 30     {
 31         printf("tid1 create error\n");
 32         return -1;
 33     }
 34 
 35     if(pthread_create(&tid2,NULL,task,(void*)&t[1])!=0)
 36     {
 37         printf("tid2 create error\n");
 38         return -1;
 39     }
 40     //回收线程资源
 41     pthread_join(tid1,NULL);
 42     pthread_join(tid2,NULL);
 43     printf("success\n");
 44     return 0;
 45 }
 46 //获取文件长度
 47 int get_len(const char *srcfile,const char *destfile)
 48 {
 49     //定义两个文件描述符变量
 50     int srcfd,destfd;
 51     //以只读形式打开源文件
 52     if((srcfd=open(srcfile,O_RDONLY))==-1)
 53     {
 54         perror("open srcfile error");
 55         return -1;
 56     }
 57     //以只写形式打开目标文件
 58     if((destfd=open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
 59     {
 60         perror("open destfile error");
 61         return -1;
 62     }
 63     //求文件大小
 64     int len=lseek(srcfd,0,SEEK_END);
 65     //关闭两个文件
 66     close(srcfd);
 67     close(destfd);
 68     return len;
 69 }
 70 //定义拷贝函数
 71 int copy_file(const char *srcfile,const char *destfile,int start,int len)
 72 {
 73     //定义两个文件描述符变量
 74     int srcfd,destfd;
 75     //以只读形式打开源文件
 76     if((srcfd=open(srcfile,O_RDONLY))==-1)
 77     {
 78         perror("open srcfile error");
 79         return -1;
 80     }
 81     //以只写形式打开目标文件
 82     if((destfd=open(destfile,O_WRONLY))==-1)
 83     {
 84         perror("open destfile error");
 85         return -1;
 86     }
 87     //移动文件光标
 88     lseek(srcfd,start,SEEK_SET);
 89     lseek(destfd,start,SEEK_SET);
 90     //拷贝
 91     char buf[128]="";
 92     int sum=0;
 93     while(1)
 94     {
 95         int res=read(srcfd,buf,sizeof(buf));
 96         sum+=res;
 97         if(sum>=len||res==0)
 98         {
 99             write(destfd,buf,res-(sum-len));//读取最后多余的数据写入文件
100             break;
101         }
102         //读取数据写入文件
103         write(destfd,buf,res);
104     }
105     //关闭文件
106     close(srcfd);
107     close(destfd);
108     return 0;
109 }
110 //分支线程函数
111 void *task(void *arg)
112 {
113     Bran t=*(Bran *)arg;
114     //分支线程拷贝后一半
115     copy_file(t.src,t.dest,t.start,t.len);
116     //退出线程
117     pthread_exit(NULL);
118 }   

运行结果:

流程图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值