学习IO的第五天

作业 :使用两个线程完成文件的拷贝写入,分线程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);

}

思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

摄像头为什么需要积分球进行校准?

摄像头均匀光源校准可以提高图像质量、消除误差因素、实现标准化测量、保证测量结果的可靠性&#xff0c;并提高生产效率。因此&#xff0c;对于需要高精度、高清晰度图像的领域&#xff0c;摄像头均匀光源校准是非常必要的。 一、为什么摄像头需要均匀光源校准&#xff1f; 提…

Javascript 函数介绍

Javascript 函数介绍 很多教程书一上来就讲解一堆语法&#xff0c;例如函数定义、函数调用什么。等读者看完了函数这一章都没搞懂什么是函数。 在讲解什么叫函数之前&#xff0c;我们先看下面一段代码&#xff1a; <!DOCTYPE html> <html xmlns"http://www.w3.…

在线工具分享SQL转ElasticSearchDSL语句

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客

腾讯云CentOS8 jenkins war安装jenkins步骤文档

腾讯云CentOS8 jenkins war安装jenkins步骤文档 一、安装jdk 1.1 上传jdk-11.0.20_linux-x64_bin.tar.gz 1.2 解压jdk安装包文件 tar -zxvf jdk*.tar.gz 1.3 在/usr/local 目录下创建java目录 cd /usr/local mkdir java 1.4 切到java目录&#xff0c;把jdk解压文件改名为jd…

智能优化算法应用:基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定5.算…

Python函数默认参数设置

在某些情况下&#xff0c;程序需要在定义函数时为一个或多个形参指定默认值&#xff0c;这样在调用函数时就可以省略为该形参传入参数值&#xff0c;而是直接使用该形参的默认值。 为形参指定默认值的语法格式如下&#xff1a; 形参名 默认值 从上面的语法格式可以看出&…

记录 | linux手动清理 buff/cache

linux下手动清理 buff/cache 切换到 root 权限 # 这个drop_caches文件可以设置的值分别为1、2、3 echo 1 > /proc/sys/vm/drop_caches # 表示清除pagecache echo 2 > /proc/sys/vm/drop_caches # 表示清除回收slab分配器中的对象&#xff08;包括目录项缓存和inode缓…

vuepress-----13、分割config

13、分割config config.js const headConfig require(./config/headConfig); const pluginsConfig require(./config/pluginsConfig); const themeConfig require(./config/themeConfig)module.exports {title: "小邵子",description: 小邵子的个人笔记,head: he…

LocalDateTime加一年取有效期23:59:59

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 打印控制台: 2023-12-08T11:59:13.739 当前系统时间

家电制造数字孪生5G智能工厂可视化系统,加速家电制造产业数字化转型

5G数字孪生、三维可视化与工业互联网的融合加速中国新型工业化进程&#xff0c;助推我国从制造大国迈进制造强国。家电行业是中国最具国际竞争力的产业之一&#xff0c;在企业数字化转型中&#xff0c;要求企业从生产设备到数字化系统&#xff0c;一系列的数字化、智能化改革已…

晶圆划片机助力LED陶瓷基板高效切割:科技提升产业新高度

博捷芯半导体划片机在LED陶瓷基板制造领域&#xff0c;晶圆划片机作为一种先进的切割工具&#xff0c;正在为提升产业效率和产品质量发挥重要作用。通过精确的切割工艺&#xff0c;晶圆划片机将LED陶瓷基板高效地切割成独立的芯片&#xff0c;为LED产业的快速发展提供了有力支持…

浅谈WPF之控件拖拽与拖动

使用过office的visio软件画图的小伙伴都知道&#xff0c;画图软件分为两部分&#xff0c;左侧图形库&#xff0c;存放各种图标&#xff0c;右侧是一个画布&#xff0c;将左侧图形库的图标控件拖拽到右侧画布&#xff0c;就会生成一个新的控件&#xff0c;并且可以自由拖动。那如…

Spring 依赖注入的三种方式优缺点

小王学习录 前言属性注入1. 属性注入的优点2. 属性注入的缺点 Setter注入Setter注入的优点Setter注入的缺点 构造方法注入1. 构造方法的优点 总结补充Aurowired注解和Resource注解的区别 前言 在前面的文章中介绍了基于注解的方式将Bean存储到Spring中, 接下来介绍如何基于注解…

银河麒麟安装lnmp,安装chrome。

银河麒麟下载地址 兆芯 arm 架构64 点击下载 安装lnmp 下载相关文件 链接&#xff1a;https://pan.baidu.com/s/1YqFLfGpE5DP3Sf_2GsXqNg?pwdptsn –来自百度网盘超级会员V7的分享 上传到服务器 我所选择上传的地方是 /home/npf/nginx-server&#xff0c; php放在跟nginx-…

vim常见操作

vim常见操作 文章目录 vim常见操作1. 回退/前进2. 搜索3. 删除4. 定位到50行5. 显示行号6. 复制粘贴7. 剪贴8. 替换9. vim打开文件的时候出现 1. 回退/前进 1.esc进入命令模式 2.ctrlr 前进 u 回退2. 搜索 1&#xff09; esc进入命令模式 2&#xff09; /text  查找text&am…

第21章:网络通信

21.1 网络程序设计基础 21.1.1 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 21.1.2 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0…

Vue3组件使用问题

Vue3组件学习 文章目录 Vue3组件学习一、Message 全局提示组件返回数据换行问题二、DatePicker 日期选择框组件限制选定年份问题 一、Message 全局提示组件返回数据换行问题 问题&#xff1a;使用中发现仅仅通过写入\n或<br/>&#xff0c;无法实现回车显示的结果。 解决…

彻底解决org.gradle.api.artifacts.DependencySubstitutions

需求背景 最近在使用android studio导入hbuilder的HBuilder-Integrate-AS工程时候报错&#xff0c;错误消息如下两种。 错误描述 第一种 Failed to notify dependency resolution listener. void org.gradle.api.artifacts.DependencySubstitutions$Substitution.with(org.g…

自动数据增广论文笔记 | AutoAugment: Learning Augmentation Strategies from Data

谷歌大脑出品 paper: https://arxiv.org/abs/1805.09501 这里是个论文的阅读心得&#xff0c;笔记&#xff0c;不等同论文全部内容 文章目录 一、摘要1.1 翻译1.2 笔记 二、(第三部分)自动增强:直接在感兴趣的数据集上搜索最佳增强策略2.1 翻译2.2 笔记 三、(第四部分)实验与结…

最小生成树算法与二分图算法

文章目录 概述 P r i m Prim Prim 算法 - 稠密图 - O ( n 2 ) O(n^2) O(n2)思路概述时间复杂度分析AcWing 858. Prim算法求最小生成树CODE K r u s k a l Kruskal Kruskal 算法 - 稀疏图 - O ( m l o g m ) O(mlogm) O(mlogm)思路解析时间复杂度分析AcWing 859. Kruskal算法求…