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

多线程编程

使用多线程完成两个文件的拷贝,分支线程1,拷贝前一半,分支线程2拷贝后一半,主线程用于回收分支线程的资源

#include<myhead.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
//定义结构用来保存源文件路径、目标文件路径、源文件长度
typedef struct {const char *src;  // 源文件路径const char *dest; // 目标文件路径int  len;
}arr;
//获取源文件字节数
int get_file_len(const char* file1,const char* file2)
{//打开源文件int fd1 = open(file1,O_RDONLY);//判断是否打开成功if(fd1==-1){perror("open error");return -1;}//顺便创建目标文件int fd2 = open(file2,O_WRONLY|O_TRUNC|O_CREAT,0664);//判断是否创建成功if(fd2==-1){perror("open error");return -1;}//将光标偏移到文件末尾获取文件长度int len = lseek(fd1,0,SEEK_END);//关闭文件close(fd1);close(fd2);return len;
}//拷贝文件
int copy_file(const char* file1,const char* file2,int start,int len)
{//以只读形式打开源文件int fd1 = open(file1,O_RDONLY);if(fd1==-1){perror("open error");return -1;}//以只写形式打开目标文件int fd2=open(file2,O_WRONLY);//将光标偏移到需要写入数据的位置lseek(fd1,start,SEEK_SET);lseek(fd2,start,SEEK_SET);//定义字符数组用于存储数据char buf[100]="";//用于计算拷贝的字节数int sum=0;int pid = getpid();while(1){//清空容器,防止覆盖不完全bzero(buf,sizeof(buf));//获取每次读取的字节数int res = read(fd1,buf,sizeof(buf));sum += res;//将最后一次读取的数据写入目标文件if(res==0||sum>=len){write(fd2,buf,res-(sum-len));break;}//读多少写多少write(fd2,buf,res);}//关闭文件close(fd1);close(fd2);
}
//分支线程1
void* task1(void* arg)
{//获取传递来的数据arr buf=*(arr *)arg;printf("分支线程1线程号为:%#lx\n",pthread_self());//拷贝前一半数据copy_file(buf.src,buf.dest,0,(buf.len)/2);//结束进程pthread_exit(0);
}//分支线程2
void* task2(void *arg)
{//获取传递的数据arr buf=*(arr *)arg;printf("分支线程2线程号为:%#lx\n",pthread_self());//拷贝后一半数据copy_file(buf.src,buf.dest,(buf.len)/2,buf.len-(buf.len)/2);//结束进程pthread_exit(0);
}int main(int argc, const char *argv[])
{//定义结构体类型变量arr buf;//源文件长度buf.len=get_file_len(argv[1],argv[2]);buf.src=argv[1];buf.dest=argv[2];//创建分支线程1pthread_t tid1;pthread_create(&tid1,NULL,task1,&buf);//创建分支线程2pthread_t tid2;pthread_create(&tid2,NULL,task2,&buf);//等待线程结束pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

思维导图


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

相关文章:

  • Java 中的【初始化块】
  • 【Flutter】状态管理:高级状态管理 (Riverpod, BLoC)
  • I/O多路转接——select、poll、epoll
  • 【ios】在 SwiftUI 中实现可随时调用的加载框
  • linux 中mysql my.cnf 配置模版
  • 【linux开发-Qt】-网络编程
  • 多表使用use_hash hint
  • 操作系统学习笔记-1.3操作系统引导,虚拟机
  • Spark广播变量(类似小表广播)
  • 【入门篇】2.8 时钟(三)
  • 【Linux从入门到精通一】操作系统概述与Linux初识
  • 物联网智能技术的深入探讨与案例分析
  • go基础(一)
  • 大数据-MySQL集群
  • 【论文速看】DL最新进展20241020-Transformer量化加速、低光增强
  • 【云从】七、云数据库
  • 2. 解析DLT698.45-2017通信规约--正向有功总电能
  • [C++]ecplise C++新建项目跑hello world
  • python中dataframe转化为list的几种方法
  • 传感器驱动系列之PAW3212DB鼠标光电传感器
  • AMBA-CHI协议详解(十)
  • Pencils Protocol 用户特权?持有 DAPP 将获 Scroll 生态空投!
  • 模型的部署:服务端与客户端建立连接(Flask)
  • GO语言编程之旅
  • 【27续】c++项目练习
  • 软件游戏缺失d3dx9_42.dll如何修复,马上教你6种靠谱的方法