当前位置: 首页 > news >正文

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;
}

 运行结果如图所示:

二、思维导图 


http://www.mrgr.cn/news/53339.html

相关文章:

  • 爬虫逆向-js进阶(续写,搭建网站)
  • 刘诗诗亮相 VOGUE 时尚盛典,三套造型出尘绝伦,美丽再惊艳众人
  • 业务诊断简介
  • [强网杯 2019]随便注1
  • 实验21:红外遥控实验
  • 通过比较list与vector在简单模拟实现时的不同进一步理解STL的底层
  • Hikyuu教程 | 滚动回测与滚动寻优系统
  • django5入门【02】创建新的django程序
  • win11 虚拟桌面切换后任务栏图标消失解决【中文互联网首发】
  • 强化学习与深度强化学习:深入解析与代码实现
  • 【MySQL】MySQL的简单了解详解SQL分类数据库的操纵方法
  • I\O进程线程(Day30)
  • 宽表和窄表
  • vb操作电子表格 增加工作表 工作表数据合并
  • 【Linux】Anaconda下载安装配置Pytorch安装配置(保姆级)
  • [Python基础](2) 基本数据类型
  • 车辆数据的提取、定位和融合(其三.一 共十二篇)子映射和时间加权
  • vb6 MSHFlexGrid1表格导出数据到电子表格 解决只能导出一次问题
  • VSCode C/C++跳转到定义、自动补全、悬停提示突然失效
  • 字节青训营入营考核部分题解