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

news2024/9/20 1:14:05

 不是哥们,脑子都烧起来了

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

思路:
1、首先创建了求文件长度的函数,在创建函数的时候,顺便将目标文件创建完成,返回源文件的大小

2、定义了一个拷贝函数,首先移动光标位置,接下来就是正常的读写操作

3、定义了线程函数,执行了文件拷贝功能

4、主函数内先求出了源文件的大小,然后用结构体封装了需要传入线程里面的数据,通过结构体数组,分别传入拷贝文件前一半的参数与后一半的参数,分别存在buf[0]和buf[1]中。

#include <myhead.h>

struct Buf
{
	const char *srcfile;
	const char *destfile;
	int start;
	int len;
};


//定义求文件长度函数
int get_file_len(const char *srcfile,const char *destfile)
{
	int sfd = -1,dfd = -1;
	//以只读的形式打开源文件
	sfd = open(srcfile,O_RDONLY);
	if(sfd == -1)
	{
		perror("open srcfile error");
		return -1;
	}

	//以创建的形式打开目标文件
	dfd = open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664);
	if(dfd == -1)	
	{
		perror("open destfile error");
		return -1;
	}

	int len = lseek(sfd,0,SEEK_END);
	//关闭文件
	close(sfd);
	close(dfd);
	
	//返回文件大小
	return len;
}

//定义拷贝文件函数
void copy_file(const char *srcfile,const char *destfile,int start,int len)
{
	int sfd = -1,dfd = -1;
	//以只读的形式打开源文件
	sfd = open(srcfile,O_RDONLY);
	if(sfd == -1)
	{
		perror("open srcfile error");
		return ;
	}

	//以只写的形式打开目标文件
	dfd = open(destfile,O_WRONLY);
	if(dfd == -1)
	{
		perror("open destfile error");
		return ;
	}

	//移动光标位置
	lseek(sfd,start,SEEK_SET);
	lseek(dfd,start,SEEK_SET);

	char buf[128] = "";       //定义容器
	int sum = 0;

	while(1)
	{
		int res = read(sfd,buf,sizeof(buf));
		sum += res;
		if(res == 0 || sum > len)   //文件读取结束
		{
			write(dfd,buf,res-(sum-len));   //最后一次拷贝
			break;
		}
		write(dfd,buf,res);
	}
	close(sfd);
	close(dfd);

}

//定义线程体函数
void *task(void *arg)
{
	const char *srcfile = ((struct Buf*)arg)->srcfile;
	const char *destfile = ((struct Buf*)arg)->destfile;
	int start = ((struct Buf*)arg)->start;
	int len = ((struct Buf*)arg)->len;

	//文件拷贝
	copy_file(srcfile,destfile,start,len);
    
    //结束线程
    pthread_exit(NULL);
}


int main(int argc, 	const char *argv[])
{
	//判断输入是否合法
	if(argc != 3)
	{
		printf("input error\n");
		return -1;
	}

	//定义线程变量
	pthread_t tid1,tid2;
	
	//求出源文件大小
	int len = get_file_len(argv[1],argv[2]);
	printf("%d\n",len);

	//封装要传递的数据
	struct Buf buf[2];
	buf[0].srcfile = argv[1];
	buf[0].destfile = argv[2];
	buf[0].start = 0;
	buf[0].len = len/2;	

	buf[1].srcfile = argv[1];
	buf[1].destfile = argv[2];
	buf[1].start = len/2;
	buf[1].len = len-len/2;	
	
	//创建两个线程
	if(pthread_create(&tid1,NULL,task,&buf[0]) != 0)
	{
		printf("创建失败\n");
		return -1;
	}

	if(pthread_create(&tid2,NULL,task,&buf[1]) != 0)
	{
		printf("创建失败\n");
		return -1;
	}

	//阻塞等待线程的结束
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	return 0;
}

实现结果如下:可以看到已经成功拷贝了

2、思维导图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短剧CPS分销系统框架+资源对接是怎么对接的?

目录 前言&#xff1a; 一、前端uniapp内容有什么&#xff1f; 二、后台管理 三、搭建CPS需要准备什么&#xff1f; 总结&#xff1a; 前言&#xff1a; 目前短剧目前在国内是非常的热门&#xff0c;观看的人群非常的多。如果希望能够通过推广短剧来做副业的话&#xff0c…

初阶数据结构.排序(2.2冒泡排序)

本节大纲&#xff1a; 冒泡排序 1.冒泡排序的思想 2.冒泡排序的特性 3.冒泡排序的实现 1.冒泡排序的思想 冒泡排序&#xff1a;是交换排序的一种&#xff0c;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序…

GenAI 会消灭软件开发人员的工作吗?

软件开发人员、程序员和编码员之间最大的争论之一是&#xff0c;人工智能会抢走我的工作吗&#xff1f;是的&#xff01;答案是肯定的&#xff1b;人工智能会抢走并取代你的工作。人工智能可能不会自己取代你&#xff0c;而是被使用人工智能的人取代。 我向 ChatGPT 提出了同样…

springboot银行客户管理系统代码--论文源码调试讲解

2 相关技术 2.1 MySQL数据库 MySQL是一种具有安全系数、安全系数、混合开发性、高效化等特征的轻量关联数据库智能管理系统。MySQL由C语言和C语言构成&#xff0c;由于C语言和C语言是混合开发的&#xff0c;因此MySQL源码是生命期的。MySQL提供多种多样数据种类&#xff0c;常…

机器学习----神经网络技术详解

机器学习中的神经网络 1. 引言1.1 机器学习的概述1.2 神经网络的重要性和应用领域1.2.1 神经网络的基本概念1.2.2 神经网络的应用领域 2. 神经网络的基础知识2.1 神经网络的定义人工神经网络&#xff08;ANN&#xff09;的基本概念神经元的结构与功能 2.2 神经网络的历史背景早…

27、Python之面向对象:方生方死?对象生命周期是如何管理的

引言 前面关于面向对象的几篇文章&#xff0c;其实主要围绕着面向对象的第一个核心理念——封装&#xff0c;进行面向对象的介绍。从类、对象的静态构成的角度&#xff0c;对类与对象的定义及使用进行介绍。 在进入面向对象另外两个理念的介绍之前&#xff0c;我觉得有必要对…

回调函数和qsort,strcmp函数

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 1&#xff0e;回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向…

【LLM大模型】GraphRAG入门学习流程

GraphRAG GraphRAG 是一种基于图的检索增强方法&#xff0c;由微软开发并开源。它通过结合LLM和图机器学习的技术&#xff0c;从非结构化的文本中提取结构化的数据&#xff0c;构建知识图谱&#xff0c;以支持问答、摘要等多种应用场景。GraphRAG的特色在于利用图机器学习算法…

7、springboot3 vue3开发平台-后端-获取用户菜单,构建菜单树列表

1. 获取用户信息并 从用户session 中获取用户信息 Operation(summary "查询当前用户菜单")GetMapping("/getSelfMenu")public Result<List<RouterVO>> getSelfMenu() {UserInfo userLoginInfo (UserInfo) StpUtil.getSession().get("u…

【Docker系列】Docker 中-d 和-it 的区别

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python开发: 飞机大战 小游戏

玩法 你可以控制飞机左右移动,躲避敌机子弹,同时发射自己的炮弹,将敌人击落! 部署方案: 1、代码如下图; 2、将代码保存到一个python中,比如planeFight.py; 3、在你的电脑中安装python环境,然后使用命令:“py planeFight.py” 运行这个文件即可; 代码 import p…

大模型深度神经网络(Deep Neural Network, DNN)

大模型深度神经网络&#xff08;Deep Neural Network, DNN&#xff09;是一种复杂的机器学习模型&#xff0c;其特点在于包含多个隐藏层&#xff0c;从而赋予模型强大的非线性表达能力和对复杂数据模式的学习能力。以下是对大模型DNN的详细介绍&#xff1a; 一、基本概念 深度…

机器学习之贝叶斯方法

机器学习之贝叶斯方法 1. 贝叶斯定理基础1.1 贝叶斯定理公式1.2 先验概率 (Prior Probability)1.3 后验概率 (Posterior Probability)1.4 似然 (Likelihood)1.5 证据 (Evidence)1.6 贝叶斯定理的应用实例 2. 贝叶斯方法的基本概念2.1 条件概率 (Conditional Probability)2.2 全…

为什么康耐视visionpro的C#二次开发调用的recorddisplay控件偶尔会显示白色的,偶尔又正常了?

recorddisplay控件正常显示 异常显示 原因分析&#xff1a; 没有完全加载recorddisplay控件&#xff0c;有可能是有bug没有完全加载&#xff0c;打断点调试控件是否完全加载。

8、springboot3 vue3开发平台-后端-使用aop 添加系统访问日志

1. 添加依赖&#xff0c; 创建数据库 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- IP地址解析 --><dependency><groupId>org.lionsou…

小程序~~3(自定义组件)

目录 1.自定义组件 创建和注册组件 数据和方法 属性properties 组件wxml的slot-插槽&#xff08;难&#xff09; 组件样式以及注意事项&#xff08;难&#xff09; 组件样式隔离&#xff08;难&#xff09; 修改checkbox样式&#xff08;难&#xff09; 数据监听函数o…

Taming Lookup Tables for Efficient Image Retouching

Abstract 高清屏幕在终端用户相机、智能手机和电视等边缘设备中的广泛使用&#xff0c;刺激了对图像增强的巨大需求。现有的增强模型通常针对高性能进行优化&#xff0c;但不能减少硬件推断时间和功耗&#xff0c;尤其是在计算和存储资源受限的边缘设备上。为此&#xff0c;我…

等保2.0与安全编程:携手共筑网络安全防线

一、基本概念 等保2.0&#xff08;网络安全等级保护2.0&#xff09;&#xff1a;作为我国网络安全领域的基本国策和制度&#xff0c;等保2.0是对原有信息安全等级保护&#xff08;等保1.0&#xff09;的全面升级。它于2019年正式实施&#xff0c;旨在应对云计算、大数据、物联网…

基于SSM的停车场管理系统 毕业设计-附源码42934

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3研究方案 1.4论文章节安排 2相关技术介绍 2.1 B/S结构 2.2 SSM框架 2.3 Java语言 2.4 MySQL数据库 3系统分析 3.1 可行性分析 3.2 系统功能性分析 3.3.非功能性分析 3.4 系统用例分析 3.5系统流程分析 3.5.1…

JAVA基础 - 反射

目录 一. 简介 二. java.lang.Class类 三. java.lang.reflect包 四. 创建对象 五. 调用方法 六. 调用成员变量 一. 简介 反射是 Java 语言中的一种强大机制&#xff0c;允许程序在运行时动态地获取类的信息、访问类的成员&#xff08;包括字段、方法和构造函数&#xff…