IOday5作业

news2024/11/21 2:23:29

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

#include<myhead.h>
//定义结构体
struct file
{
	const char* srcfile;//背拷贝文件路径
	const char* destfile;//拷贝文件路径
	int head;//光标初始位置
	int size_len;//移动的大小
};

/****************************计算大小**********************************/
int size_file(const char* file1,const char* file2)
{
	int fd1 = -1;
	int fd2 = -1;
	//打开被拷贝文件
	if((fd1 = open(file1,O_RDONLY))==-1)
	{
		perror("open");
		return -1;
		exit(1);
	}
	//创建拷贝文件
	if((fd2 = open(file2,O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)
	{
		perror("open");
		return -1;
	}
	//计算大小
	int len = lseek(fd1,0,SEEK_END);
	//关闭文件
	close(fd1);
	close(fd2);
	return len;
}



/********************拷贝函数**************************/
//文件拷贝
void* cpy(void* arg)
{
	struct file file_front = *((struct file*)arg);	
	//打开被拷贝文件
	int fd1 = -1;
	int fd2 = -1;
	if((fd1 = open(file_front.srcfile,O_RDONLY))==-1)
	{
		perror("open");
		exit(1);
	}
	//打开拷贝文件
	if((fd2 = open(file_front.destfile,O_WRONLY)) == -1)
	{
		perror("open");
		exit(1);
	}
	char buf[128]="";
	int res = -1;
	int num = 0;
	lseek(fd1,file_front.head,SEEK_SET);
	lseek(fd2,file_front.head,SEEK_SET);
	while(1)
	{
		res = read(fd1,buf,sizeof(buf));
		num += res;
		if(num >= file_front.size_len||res==0)
		{
			write(fd2,buf,res-(num-file_front.size_len));
			break;
		}
		write(fd2,buf,res);
	}
	close(fd1);
	close(fd2);
	pthread_exit(NULL);

}
/**********************主函数***************************/
int main(int argc, const char *argv[])
{
	//判断输入是否正确
	if(3 != argc)
	{
		printf("输入错误\n");
		return -1;
	}

	//计算要拷贝的文件大小,并创建目标文件
	int len = size_file(argv[1],argv[2]);

	//创建两个线程
	pthread_t tid1 = -1;
	pthread_t tid2 = -1;
	struct file information_front={argv[1],argv[2],0,len/2};
	if(pthread_create(&tid1,NULL,cpy,&information_front))
	{
		printf("tid1创建错误\n");
		return -1;
	}
	struct file information_rear={argv[1],argv[2],len/2,len-len/2};
	if(pthread_create(&tid2,NULL,cpy,&information_rear))
	{
		printf("tid2创建错误\n");
		return -1;
	}



	//回收线程
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	return 0;
}

效果图:

互斥锁练习

#include<myhead.h>

int money = 5000;

pthread_mutex_t mutex;

void* tsak(void* arg)
{
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mutex);
		money -= 50;
		printf("B取出50元,还剩%d元\n",money);
		//解锁
		pthread_mutex_unlock(&mutex);
		sleep(1);
	}
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	pthread_t tid = -1;
	//互斥锁初始化
	pthread_mutex_init(&mutex,NULL);
	
	//创建线程
	if(pthread_create(&tid,NULL,tsak,NULL) != 0)
	{
		printf("创建线程错误\n");
		return -1;
	}

	while(1)
	{
		//上锁
		pthread_mutex_lock(&mutex);
		money -= 100;
		printf("A取出100元,还剩%d元\n",money);
		//解锁
		pthread_mutex_unlock(&mutex);
		sleep(1);
	}

	pthread_join(tid,NULL);

	pthread_mutex_destroy(&mutex);

	return 0;
}

效果图:

 

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

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

相关文章

kafka学习笔记--安装部署、简单操作

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

vue中设置滚动条的样式

在vue项目中&#xff0c;想要设置如下图中所示滚动条的样式&#xff0c;可以采用如下方式&#xff1a; ​// 直接写在vue.app文件中 ::-webkit-scrollbar {width: 3px;height: 3px; } ::-webkit-scrollbar-thumb { //滑块部分// border-radius: 5px;background-color: #1890ff;…

性能测试LoadRunner解决动态验证码问题

对于这个问题&#xff0c;通常我们可以采取以下三个途径来解决该问题&#xff1a; 1、第一种方法&#xff0c;也是最容易想到的&#xff0c;在被测系统中暂时屏蔽验证功能&#xff0c;也就是说&#xff0c;临时修改应用&#xff0c;无论用户输入的是什么验证码&#xff0c;都…

IPC之四:使用 POSIX 消息队列进行进程间通信的实例

IPC 是 Linux 编程中一个重要的概念&#xff0c;IPC 有多种方式&#xff0c;本文主要介绍消息队列(Message Queues)&#xff0c;消息队列可以完成同一台计算机上的进程之间的通信&#xff0c;相比较管道&#xff0c;消息队列要复杂一些&#xff0c;但使用起来更加灵活和方便&am…

2023.12.1 --数据仓库之 拉链表

目录 什么是拉链表 为什么要做拉链表? 没使用拉链表: 使用了拉链表: 题中订单拉链表的形成过程 实现语句 什么是拉链表 拉链表是缓慢渐变维的一种解决方案. 拉链表,记录每条信息的生命周期,一旦一条记录的生命周期结束,就重新开始一条新的记录,并把当前日期放入生效开始…

snapde批量手机号码归属地查询

一、引言 手机号码归属地如何查询&#xff1f;在网上一个一个去查询吗&#xff1f;有没有什么软件能够对几万、几十万、上百万的手机号码批量查询出来归属地呢&#xff1f;答案是有&#xff0c;snapde软件能够用一条公式完成表格内所有手机归属地的查询。 二、操作方法 1、打…

Hackademic.RTB1

信息收集 判断存活主机 nmap -sT --min-rate 10000 192.168.182.0/24Nmap scan report for 192.168.182.135 Host is up (0.030s latency). Not shown: 992 filtered tcp ports (no-response), 6 filtered tcp ports (host-unreach) PORT STATE SERVICE 22/tcp closed ssh …

IPTABLES(一)

文章目录 1. iptables基本介绍1.1 什么是防火墙1.2 防火墙种类1.3 iptables介绍1.4 包过滤防火墙1.5 包过滤防火墙如何实现 2. iptables链的概念2.1 什么是链2.2 iptables有哪些链 3. iptables表的概念3.1 什么是表3.2 表的功能3.3 表与链的关系 4. iptables规则管理4.1 什么是…

Spring MVC详解、静态资源访问、拦截器

1. Spring MVC概述 1.1 Spring MVC是什么 SpringMVC是Spring的一个模块&#xff0c;是一个基于MVC设计模式的web框架。 1.2 Spring MVC执行流程。 1.3 组件分析 前端控制器&#xff08;默认配置&#xff09;Dispatcher Servlet 作用&#xff1a;只负责分发请求。可以很好的对…

HL7/FHIR 是什么

如果你对上面 2 个单词不熟悉的话&#xff0c;那就需要先脑补下了。 HL7 HL7 可以认为是一个标准化的组织&#xff0c;这个组织主要对标准进行控制。 如果你希望在医疗系统中对数据进行交换&#xff0c;通常 HL7 现在就是事实上的标准了。 FHIR FHIR – Fast Health Inter…

urllib 异常、cookie、handler及代理(四)

目录 一、urllib异常 二、urllib cookie登录 三、urllib handler 处理器的基本使用 四、urllib 代理和代理池 参考 一、urllib异常 URLError/HTTPError 简介&#xff1a; 1.HTTPError类是URLError类的子类 2.导入的包urllib.error.HTTPError urllib.error.URLError 3.h…

JavaScript单页面路由详解:打造现代化、高性能的Web应用

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-spa单页面路由 目录 # 基于SPA的单页面路由 关于单页应用 单页应用的…

编程实战:自己编写HTTP服务器(系列2:请求)

系列入口&#xff1a;编程实战&#xff1a;自己编写HTTP服务器&#xff08;系列1&#xff1a;概述和应答&#xff09;-CSDN博客 本文介绍如何处理请求。 目录 一、概述 二、成员变量 三、接收并分解请求 四、完整代码 五、HTTP处理框架 一、概述 请求和应答结构其实差不多…

Axure原型图表组件库,数据可视化元件(Axure9大屏组件)

针对Axure制作的大屏图表元件库&#xff0c;帮助产品经理更高效地制作高保真图表原型&#xff0c;是产品经理必备元件工具。现分享完整的组件库&#xff0c;大家一起学习。 本组件库的图表模块&#xff0c;已包含所有常用的图表&#xff0c;以下为部分组件截图示意。文末可下载…

Axure原型组件库,数据可视化动态元件库(超详细Axure9可视化素材)

专门针对Axure制作的动态图表元件库&#xff0c;帮助产品经理更高效地制作高保真图表原型&#xff0c;是产品经理必备元件工具。现分享完整 Axure 9 的组件库&#xff0c;大家一起学习。&#xff08;如需 Axure 8组件请详见文末&#xff09; 每一个动态组件在原型文件中都配有…

NLP自然语言处理学习笔记

参考&#xff1a;NLP&#xff08;自然语言处理&#xff09;介绍 - 知乎 (zhihu.com) 一、NLP是什么 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自…

小航助学2023年6月GESP_Scratch二级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号 单选题3.00分 删除编辑附件图文 答案:D 第1题高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在计算机上运行的可执行代码。 A、编辑B、…

Liunx系统使用超详细(四)~文件/文本相关命令2

承接文章Liunx系统使用超详细(四)~文件/文本相关命令1http://t.csdnimg.cn/f7G6S 目录 一、awk命令(三剑客之一) 1.1工作原理 1.2工作流程 1.3语法格式 1.3.1格式注释&#xff1a; 1.3.2模式&#xff08;pattern&#xff09;的类型&#xff1a; 1.3.3动作&#xff08;ac…

Java期末复习题之继承

点击返回标题->23年Java期末复习-CSDN博客 第1题. 设计一个学生类Student&#xff0c;其数据成员有name(姓名)、age(年龄)和degree(学位)。由Student类派生出本科生类Undergraduate和研究生类Graduate&#xff0c;本科生类Undergraduate增加成员specialty(专业)&#xff0c;…

vue-tree-color 组件实现组织架构图遇到的坑和解决方案以及实现

**1、前期工作可以先看看大佬的文章 **https://blog.csdn.net/Try_your_best_l/article/details/120173192?spm1001.2101.3001.6650.5&utm_mediumdistribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-5-120173192-blog-128109597.235%5Ev38%5Epc_relevant_default…