学习IO的第五天

news2024/11/20 6:22:09

作业 :使用两个线程完成文件的拷贝写入,分线程1写入前半段,分线程2写入后半段,主线程用来回收资源

#include <head.h>

void *sork(void *arg);
void *sork2(void *arg);

int file_copy(int start,int len)   //拷贝的函数
{
	int rd = -1;
	int wd = -1;

	if((rd = open("./01_test.c",O_RDONLY)) == -1)
	{
		printf("open_r error\n");
	}

	if((wd = open("./text.txt",O_WRONLY)) == -1)
	{
		printf("open_w error\n");
	}

	lseek(rd,start,SEEK_SET);
	lseek(wd,start,SEEK_SET);
	char buf[128]="";
	int count = 0;

	while(1)
	{
		int res = read(rd,buf,sizeof(buf));
		count += res;
		if(count >= len || res == 0)
		{
			write(wd,buf,res-(count-len));
			break;
		}
		write(wd,buf,res);
	}
	close(rd);
	close(wd);

}

int length()
{
	int rd = -1;
	int wd = -1;

	if((rd = open("./01_test.c",O_RDONLY)) == -1)
	{
		perror("open_r error\n");
		return -1;
	}

	if((wd = open("./text.txt",O_WRONLY|O_CREAT|O_TRUNC,0664) == -1))
	{
		perror("open_w error\n");
		return -1;
	}

	int len = lseek(rd,0,SEEK_END);

	close(rd);
	close(wd);
	
	return len;
}

int main(int argc, const char *argv[])
{
	pthread_t tid = -1;
	pthread_t tid2 = -1;

	int len = length();   //获取文件大小

	if(pthread_create(&tid, NULL, sork, &len) != 0) //创建线程1
	{
		printf("创建线程失败\n");
		return -1;
	}
	if(pthread_create(&tid2, NULL, sork2, &len) != 0) //创建线程2
	{
		printf("创建线程失败\n");
		return -1;
	}


	pthread_join(tid,NULL);
	pthread_join(tid2,NULL);
	printf("已回收分线程资源\n");
	return 0;
}


void *sork(void *arg)  //分支线程1
{
	int len = *(int *)arg;   

	file_copy(0,len/2);   //调用拷贝的函数

	printf("分支线程1退出\n");

	pthread_exit(NULL);
}

void *sork2(void *arg)  //分支线程2
{
	int len = *(int *)arg;

	file_copy(len/2,len-len/2);   //调用拷贝的函数

	printf("分支线程2退出\n");
	pthread_exit(NULL);
}

结果

不调函数,一样

#include <head.h>

void *sork(void *arg);
void *sork2(void *arg);


int length()
{
	int rd = -1;
	int wd = -1;

	if((rd = open("./01_test.c",O_RDONLY)) == -1)
	{
		perror("open_r error\n");
		return -1;
	}

	if((wd = open("./text.txt",O_WRONLY|O_CREAT|O_TRUNC,0664) == -1))
	{
		perror("open_w error\n");
		return -1;
	}

	int len = lseek(rd,0,SEEK_END);

	close(rd);
	close(wd);
	
	return len;
}

int main(int argc, const char *argv[])
{
	pthread_t tid = -1;
	pthread_t tid2 = -1;

	int len = length();

	if(pthread_create(&tid, NULL, sork, &len) != 0) //创建线程1
	{
		printf("创建线程失败\n");
		return -1;
	}
	if(pthread_create(&tid2, NULL, sork2, &len) != 0) //创建线程2
	{
		printf("创建线程失败\n");
		return -1;
	}


	pthread_join(tid,NULL);
	pthread_join(tid2,NULL);
	return 0;
}


void *sork(void *arg)  //分支线程1
{
	int len = *(int *)arg;

	int rd = -1;
	int wd = -1;

	printf("进入分支线程1\n");
	if((rd = open("./01_test.c",O_RDONLY)) == -1)
	{
		printf("open_r error\n");
	}

	if((wd = open("./text.txt",O_WRONLY)) == -1)
	{
		printf("open_w error\n");
	}

	lseek(rd,0,SEEK_SET);
	lseek(wd,0,SEEK_SET);
	char buf[128]="";
	int count = 0;

	while(1)
	{
		int res = read(rd,buf,sizeof(buf));
		count += res;
		if(count >= len/2 || res == 0)
		{
			write(wd,buf,res-(count-len/2));
			break;
		}
		write(wd,buf,res);
	}
	close(rd);
	close(wd);
	pthread_exit(NULL);
}

void *sork2(void *arg)  //分支线程2
{
	int len = *(int *)arg;

	int rd = -1;
	int wd = -1;

	printf("进入分支线程2\n");
	if((rd = open("./01_test.c",O_RDONLY)) == -1)
	{
		printf("open_r error\n");
	}

	if((wd = open("./text.txt",O_WRONLY)) == -1)
	{
		printf("open_w error\n");
	}

	lseek(rd,len/2,SEEK_SET);
	lseek(wd,len/2,SEEK_SET);
	char buf[128]="";
	int count = 0;

	while(1)
	{
		int res = read(rd,buf,sizeof(buf));
		if(res == 0)
		{
			break;
		}
		write(wd,buf,res);
	}
	close(rd);
	close(wd);

	pthread_exit(NULL);

}

思维导图

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

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

相关文章

Vulnerability: File Upload(Medium)--MYSQL注入

选择难度&#xff1a; 1.打开DVWA&#xff0c;并登录账户 2.选择模式&#xff0c;这里我们选择 文件上载的中级模式&#xff08;Medium&#xff09; 准备工作 1.在vsc里面写个一句话木马 2.下载BurpSuiteCommunit软件&#xff1a;百度搜索“burp suite官网” 下载地址www…

Xilinx FPGA——ISE时序约束“建立时间不满足”问题解决记录

一、现象 最近使用赛灵思的FPGA设计项目时&#xff0c;出现时序约束失效问题。 点进去发现如下&#xff1a; 一个始终约束没有生效&#xff0c;有多处报错。 二、原因 出现这个问题的原因是&#xff0c;建立时间不满足。 时序违例的主要原因是建立时间和保持时间不满足要求&a…

智能化与数字化:开展企业合规工作的新价值与方法

在现代商业环境中&#xff0c;企业合规成为了一项至关重要的任务。随着法规和监管标准的增加以及对企业道德和责任的更高要求&#xff0c;开展合规工作不仅有助于保护企业的声誉和利益&#xff0c;还能提升企业的竞争力和可持续发展。本文将探讨通过智能化和数字化手段开展合规…

碳化硅MOS管在三相逆变器上的应用-REASUNOS瑞森半导体

一、前言 三相逆变是指转换出的交流电压为三相&#xff0c;即AC380V&#xff0c;三相电是由三个频率相同、振幅相等、相位依次互差120度的交流电势组成。 三相逆变器的定义是将直流电能转换为交流电能的转换器&#xff0c;其基本原理就是SPWM&#xff0c;硬件架构为四个功率模…

9.关于Java的程序设计-基于Springboot的家政平台管理系统设计与实现

摘要 随着社会的进步和生活水平的提高&#xff0c;家政服务作为一种重要的生活服务方式逐渐受到人们的关注。本研究基于Spring Boot框架&#xff0c;设计并实现了一种家政平台管理系统&#xff0c;旨在提供一个便捷高效的家政服务管理解决方案。系统涵盖了用户注册登录、家政服…

超静音的两相步进电机国产驱动芯片GC6609,为什么可替代TMC2208/2209/trinamic的数据分析

GC6609 是一款超静音的两相步进电机驱动芯片&#xff0c;内置最大 256 细分的步进驱动模式&#xff0c; 超静音&#xff0c;低振动。芯片可以工作在 4~36V 的宽工作电压范围内&#xff0c;平均工作电流可以达到 2A&#xff0c;峰值电流 4A。内置自动增益控制环路&#xff08;AG…

《算法竞赛进阶指南》------图论篇

文章目录 0x01 Telephone Lines POJ - 36620x02 P1073 [NOIP2009 提高组] 最优贸易0x03 道路和航线 BZOJ22000x04 Sorting It All Out POJ - 1094 topo0x05 Sightseeing trip POJ - 1734 最小环问题0x06 Cow Relays POJ - 3613 S到E经过k条边的最短路0x07 走廊泼水节 &#xff…

美颜SDK算法是什么?美肤、滤镜与实时处理技术讲解

美颜SDK的出现&#xff0c;为开发者提供了一种方便、高效的方式&#xff0c;使其能够轻松地将先进的美颜算法集成到各种应用中。本文将深入探讨美颜SDK算法的本质&#xff0c;以及其在美肤、滤镜与实时处理等方面的技术讲解。 一、美颜SDK算法简介 美颜SDK算法是一套通过计算…

网络攻击(一)--安全渗透简介

1. 安全渗透概述 目标 了解渗透测试的基本概念了解渗透测试从业人员的注意事项 1.1. 写在前面的话 在了解渗透测试之前&#xff0c;我们先看看&#xff0c;信息安全相关的法律是怎么样的 中华人民共和国网络安全法 《中华人民共和国网络安全法》由全国人民代表大会常务委员会…

SpringBoot+线程池实现高频调用http接口并多线程解析json数据

场景 SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)&#xff1a; SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)-CSDN博客 Java中ExecutorService线程池的使用(Runnable和Callable多…

【conda】利用Conda创建虚拟环境,Pytorch各版本安装教程(Ubuntu)

TOC conda 系列&#xff1a; 1. conda指令教程 2. 利用Conda创建虚拟环境&#xff0c;安装Pytorch各版本教程(Ubuntu) 1. 利用Conda创建虚拟环境 nolonolo:~/sun/SplaTAM$ conda create -n splatam python3.10查看结果&#xff1a; (splatam) nolonolo:~/sun/SplaTAM$ cond…

应用现代化加速企业数字化转型

目录 一、数字化转型的必要性 二、应用现代化的推动力 数字化时代&#xff0c;企业正面临着前所未有的挑战和机遇。为了保持竞争力&#xff0c;许多企业正在寻求数字化转型&#xff0c;以提升运营效率、优化客户体验、创新商业模式。本文将探讨如何通过应用现代化加速企业数字化…

《算法竞赛进阶指南》数论篇

下述理论主要参考书目&#xff1a; 电子版pdf:算法竞赛进阶指南(p133-150) 文章目录 下述理论主要参考书目&#xff1a; [电子版pdf:算法竞赛进阶指南(p133-150)](http://www.j9p.com/down/536233.html)首先补充两个前置知识&#xff1a;约数和最大约数有关性质&#xff0c;可选…

二层交换原理

二层交换设备工作在OSI模型的第二层&#xff0c;即数据链路层&#xff0c;它对数据包的转发是建立在MAC&#xff08;Media Access Control &#xff09;地址基础之上的。二层交换设备不同的接口发送和接收数据独立&#xff0c;各接口属于不同的冲突域&#xff0c;因此有效地隔离…

Linux学习笔记之八(进程间的共享内存)

Linux 1、引言2、实现共享内存2.1、创建一个共享内存2.2、将共享内存链接到进程空间2.3、断开与共享内存的链接2.4、对共享内存进行后续操作 3、应用实例 1、引言 在之前一篇文章Linux学习笔记之六&#xff08;进程之间的管道通信和信号处理&#xff09;中我讲了进程间可以通过…

如何快速构建知识服务平台,打造个人或企业私域流量

随着互联网的快速发展&#xff0c;传统的知识付费平台已经不能满足用户的需求。而SaaS知识付费小程序平台则是一种新型的知识付费方式&#xff0c;具有灵活、便捷、高效等特点&#xff0c;为用户提供了更加优质的付费知识服务。本文将介绍如何搭建自己的SaaS知识付费小程序平台…

T天池SQL训练营(五)-窗口函数等

–天池龙珠计划SQL训练营 5.1窗口函数 5.1.1窗口函数概念及基本的使用方法 窗口函数也称为OLAP函数。OLAP 是OnLine AnalyticalProcessing 的简称&#xff0c;意思是对数据库数据进行实时分析处理。 为了便于理解&#xff0c;称之为窗口函数。常规的SELECT语句都是对整张表进…

elasticsearch-head 启动教程

D:\elasticsearch-head-master>grunt server ‘grunt’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 npm install -g grunt-clinpm install

资源三号5米全国数字高程模型DEM

简介 近些年来&#xff0c;国产高分辨率遥感卫星的发展突飞猛进&#xff0c;天绘系列卫星、资源三号卫星、高分一号、二号卫星以不断提高的影像空间分辨率、逐步增强的影像获取能力、较好的影像现势性等特点逐步打破了国外商业卫星的主导地位&#xff0c;开始广泛服务于各…

Andorid sudio 换行方法

1.遇到的问题&#xff0c;二维码内容要换行 String text "成绩&#xff1a;1000 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff…