IO作业day5

2023-10-26

1> 使用两个线程完成两个文件的拷贝,主线程拷贝前一半内容,子线程拷贝后一半内容,并且主线程要阻塞回收子线程资源

2> 使用三个进程完成两个文件的拷贝,主线程拷贝前三分之一,子线程1拷贝中间三分之一,子线程2拷贝后三分之一,主线程要设置两个子线程为分离态

1:

#include <myhead.h>
struct Node
{
	const char *srcfile;
	const char *dstfile;
	int stat;
	int len;
};
//获取文件大小函数
int getlen(const char *srcfile, const char *dstfile)
{
	int fd1,fd2;
	//以只写形式打开源文件
	if((fd1=open(srcfile,O_RDONLY)) == -1)
	{
		perror("srcfile open error");
		return -1;
	}

	if((fd2=open(dstfile, O_WRONLY|O_CREAT|O_TRUNC, 0664)) == -1)
	{
		perror("dstfile open error");
		return -1;
	}
	//求源文件的长度
	int len = lseek(fd1,0,SEEK_END);
	close(fd1);
	close(fd2);
	return len;
}
//拷贝文件函数
void copy_file(const char *srcfile, const char *dstfile, int start, int len)
{
	int fd1,fd2;
	if((fd1=open(srcfile,O_RDONLY)) == -1)
	{
		perror("srcfile open error");
		return ;
	}
	if((fd2=open(dstfile,O_WRONLY)) == -1)
	{
		perror("dstfile open error");
		return ;
	}
	//将光标移动至开始拷贝的位置
	lseek(fd1,start,SEEK_SET);
	lseek(fd2,start,SEEK_SET);
	//开始拷贝
	char buf[100]="";
	int sum=0;

	while(1)
	{
		int ret = read(fd1, buf, sizeof(buf));
		sum += ret;

		if(ret == 0 || sum > len)
		{
			write(fd2, buf, ret-(sum-len));
			break;
		}
		write(fd2, buf, ret);
	}
	printf("拷贝成功\n");
}
//线程1
void *task1(void *arg)
{
	//解压结构体数据
	struct Node File = *(struct Node*)arg;
	//调用拷贝函数复制后一半文件
	copy_file(File.srcfile, File.dstfile, File.stat, File.len);
	pthread_exit(NULL);//退出当前线程
}

int main(int argc, const char *argv[])
{	
	//判断传入文件个数
	if(argc != 3)
	{
		printf("input file error\n");
		printf("usage:./a.out srcfile dstfile\n");
		return -1;
	}
	//获取文件大小
	int len = getlen(argv[1],argv[2]);

	//定义结构体变量
	struct Node cpy_file1 = {argv[1], argv[2], len/2, len-len/2};

	pthread_t tid;//创建线程

	if(pthread_create(&tid,NULL,task1,&cpy_file1))
	{
		printf("线程创建失败\n");
		return -1;
	}	
	//调用拷贝函数拷贝前一半文件
	 copy_file(argv[1], argv[2],0 ,len/2);
	 //阻塞回收线程1资源
	 pthread_join(tid,NULL);
	return 0;
}

结果:

 2:

#include <myhead.h>

//定义结构体
struct Node
{
	const char *srcfile;
	const char *dstfile;
	int stat;
	int len;
};

//定义获取文件大小函数
int getlen(const char *srcfile, const char *dstfile)
{
	//定义两个文件指针
	FILE *srcfp, *dstfp;
	if((srcfp=fopen(srcfile,"r")) == NULL)
	{
		perror("srcfile open error");
		return -1;
	}
	if((dstfp=fopen(dstfile,"w")) == NULL)
	{
		perror("dstfile open error");
		return -1;
	}
	//求源文件大小
	fseek(srcfp, 0, SEEK_END);
	int len = ftell(srcfp);

	return len;
}

//定义拷贝文件函数
void copy_file(const char *srcfile, const char *dstfile, int start, int len)
{
	FILE *srcfp, *dstfp;
	if((srcfp=fopen(srcfile,"r")) == NULL)
	{
		perror("srcfile open error");
		return ;
	}
	if((dstfp=fopen(dstfile,"w")) == NULL)
	{
		perror("dstfile open error");
		return ;
	}
	//将光标移动至开始拷贝的位置
	fseek(srcfp, start, SEEK_SET);
	fseek(dstfp, start, SEEK_SET);
	char buf;
	int sum = 0;

	while(ftell(srcfp) != (len))
	{
		buf = fgetc(srcfp);
		fputc(buf, dstfp);
	}
	printf("拷贝成功\n");
}
void *task1(void *arg)
{
	//printf("1");
	sleep(2);
	struct Node cp = *(struct Node*)arg;
	copy_file(cp.srcfile, cp.dstfile, cp.stat, cp.len);
	pthread_exit(NULL);
}
void *task2(void *arg)
{
	//printf("2");
	sleep(4);
	struct Node cp = *(struct Node *)arg;
	copy_file(cp.srcfile, cp.dstfile, cp.stat, cp.len);

	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//判断传入文件个数
	if(argc != 3)
	{
		printf("input file error\n");
		printf("usage:./a.out srcfile dstfile\n");
		return -1;
	}
	//获取文件大小
	int len = getlen(argv[1],argv[2]);
	struct Node cp_file1={argv[1], argv[2], len/3, len*2/3 };
	//定义子线程1
	pthread_t tid1;
	if(pthread_create(&tid1, NULL, task1, &cp_file1))
	{
		printf("线程创建失败\n");
		return -1;
	}
	pthread_t tid2;
	struct Node	cp_file2={argv[1], argv[2], len*2/3, len };
	if(pthread_create(&tid2, NULL, task2, &cp_file2))
	{
		printf("线程创建失败\n");
		return -1;
	}
	copy_file(argv[1], argv[2], 0, len/3);
	sleep(6);
	pthread_detach(tid1);	
	pthread_detach(tid2);
	return 0;
}

结果:

 

思维导图:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IO作业day5 的相关文章

随机推荐

  • 响应式布局(媒体查询+%)

    总结 核心思想 每一个最外层盒子给一个max width 盒子中的内容width全部使用 表示 使用 元素全部写在盒子里 当媒体查询满足情况是display block 注意 精确的是需要一样的 媒体查询相当于if 过渡的动画写在默认样式里
  • 读书笔记-看见未来:改变互联网世界的人们

    作者 余晨 推荐序二 未来从来不会自动地发生 世界正在重新 造物 它既是虚拟意义上的 又同时是实物意义上的 宙斯在假眠 而诸神则各逞其能 时代 曾经刊登过的一篇文章认为 今天的个人计算机革命和互联网之所以成为这样 乃是继承了20世纪60年代
  • LLVM汇编语言指导手册之指令手册

    下面是我对llvm汇编中一些不常用的指令的总结 shl 指令 语法
  • wazuh日志审计--定制规则

    日志审计 定制规则 目录布局 规则集文件夹结构如下所示 在接收到agent传来的日志后 manager会根据 var ossec ruleset decoders里面的各种规则对日志进行处理 提取到了指定字段的值之后再根据 var osse
  • 物理这一块真不好搞,

    研究了一段PHYSX 发现真是寸步难行 英文文档也不是很详细 哎 没人带着的话 还是不搞为好 继续封装软引擎吧 没法干了 心里泼凉泼凉的 哎 咋弄呢 看来只能当个兴趣爱好了 或许用下游戏引擎 看看有没有集成好的
  • TensorFlow 深度学习笔记 Stochastic Optimization

    Stochastic Optimization 转载请注明作者 梦里风林 Github工程地址 https github com ahangchen GDLnotes 欢迎star 有问题可以到Issue区讨论 官方教程地址视频 字幕下载
  • adb移植到Android平台使用

    adb移植到Android平台使用 1 工具源码 所需源码 openssl git clone https github com openssl openssl git zlib 1 2 8 git clone https github c
  • JSOUP爬取4K高清壁纸

    jsoup jar包 1 11 2 链接 https pan baidu com s 1pe3 r5 YB pGEsosfRLbsA pwd 41w5 提取码 41w5 效果 代码 import org jsoup Jsoup import
  • Java.nio.file.NoSuchFileException] - 文件未找到异常处理及解决方法

    Java nio file NoSuchFileException 文件未找到异常处理及解决方法 在日常的Java开发中 我们经常会遇到各种异常情况 其中之一就是 Java nio file NoSuchFileException 即文件未
  • 求帮助安装mysql 出现红色感叹号

  • 【python】【django】cursor.fetchall()的结果是元组

    今天做测试 用django db 的connection来执行一个非常简单的查询语句 sql str select col 1 from table 1 where criteria 1 cursor connection cursor c
  • 混乱的代码是技术债吗

    翻译自 Uncle Bob 的 Blog A Mess is not a Technical Debt 主要是鲍勃大叔的观点 混乱的代码实现不是技术债 原文地址见超链接 The term Technical Debt was created
  • 成功解决安装tensorflow,安装进度1/4,爆红一大片且有很多File出现timed out

    之前安装几次 CPU tensorflow总是出现一大片红 自己发现其中一个原因是python版本和tensorflow不对应 tensorflow 2 0 0 得和python3 5 3 7对应 我之前的版本是3 8 5 会出现不兼容情况
  • 银行定期存款产品目标客户的确定——基于逻辑回归

    本篇文章将会介绍用Python分析银行定期存款产品目标客户的确定详细建模细节 业务框架分析以及模型的选择与评估分析参见上一篇文章 银行定期存款产品目标客户的确定 基于逻辑回归 建模前分析 1 导入各种模块并读取数据 2 数据预处理 维规约
  • STM32 keil中__IO得意思

    IO解释 STM32得库函数中 HAL和LL库都有 存在一个 IO得宏定义 define I volatile const lt defines read only permissions define O volatile lt defi
  • STM32配置时钟系统流程(固件库/外设标准库)

    前提 STM32F10x系列固件库 标准外设库 前言 固件库帮我们写好了 时钟系统 时钟树 的配置函数 该函数也不需要我们去调用 只要正确包含了STM32的启动文件 s文件 就行 s启动文件调用执行了时钟配置函数 先于main函数执行 s启
  • “钢铁侠”大战“机器人”!马斯克称「笼中格斗」将在 X 上直播,小扎应战:8 月 26 日如何?...

    由马斯克和扎克伯格领衔 随后引爆全网讨论的 约架 已过去快两个月 先是约定在拉斯维加斯来一场 笼中格斗 接着网友看热闹不嫌事大的做起了预告海报 最后由马斯克母亲出面叫停 当大家以为格斗一事要不了了之时 马斯克再次发声 要打 准备在 X 上直
  • 【Android】拾物App期末作业

    一 期末作业题目 校园失物 拾物APP 二 实施目的 通过本实训 使受训者可以深入理解Android相关技术 并将所学知识应用到实际的中等规模的程序设计中 同时 通过本实训 受训者可以拓展Android相关的知识 提升受训者的能力 三 实施
  • java中JDK JRE JVM的关系

    1 1 软件开发介绍 程序是为了模拟现实世界 解决显示问题而使用计算机语言编写的一系列有序的指令集合 软件 即一系列按照特定顺序组织的计算机数据和指令集合 有系统软件和应用软件之分 人机交互方式 图形化界面 GUI 命令行方式 CLI 常用
  • IO作业day5

    1 gt 使用两个线程完成两个文件的拷贝 主线程拷贝前一半内容 子线程拷贝后一半内容 并且主线程要阻塞回收子线程资源 2 gt 使用三个进程完成两个文件的拷贝 主线程拷贝前三分之一 子线程1拷贝中间三分之一 子线程2拷贝后三分之一 主线程要