华清远见作业第二十一天——IO(第四天)

news2024/11/28 20:52:06

思维导图:

 创建出三个进程完成两个文件之间拷贝工作,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程回收子进程的资源。

代码:

#include<myhead.h>
int main(int argc, const char *argv[])
{
	if(argc!=3)
	{
		printf("内容错误\n");
		return -1;
	}
	//定义字符搬运工
	char buf[100]="";
	//以只读的形式打开源文件
	FILE *rfp=NULL;
	if((rfp=fopen(argv[1],"r"))==NULL)
	{
		perror("rfp error");
		return -1;
	}
	//使用fseek和ftell函数定位到文件的数量
	//fseek(文件指针,偏移量,开始的位置)
	//ftell(文件中指针),直接返回文件的位置,既把指针最后的位置,返回文件数量
	int num=0;    //计数	
	fseek(rfp,0,SEEK_END);	//光标偏移到文件最后的位置
	num=ftell(rfp);   //返回值就是文件的数量
	fseek(rfp,0,SEEK_SET);   //光标偏移到文件开头的位置


	//定义追加写的形式打开文件
	FILE *wfp=NULL;
	if((wfp=fopen(argv[2],"a"))==NULL)
	{
		perror("wfp error");
		return -1;
	}
	pid_t pid1=-1;
	//创建一个子进程
	pid1=fork();
	if(pid1==0)
	{
		printf("我是老大\n");
		printf("拷贝文档后部分内容\n");
		//定义追加写的形式打开文件
		FILE *wfp=NULL;
		if((wfp=fopen(argv[2],"a"))==NULL)
		{
			perror("wfp error");
			return -1;
		}
		//bzero(清零的地址,空间字节数)
		//防止buf中有内容影响操作
		bzero(buf,sizeof(buf));	//清零buf
		//由于读文件已经打开,故需要把光标定位到开头
		fseek(rfp,num/2,SEEK_SET); //光标定位从开头偏移到num/2后面
		//由于需要限制位置,所以使用fread函数来进行读取
		int count=fread(buf,sizeof(buf[0]),num-num/2,rfp);
		//写入使用fwrite函数
		fwrite(buf,sizeof(buf[0]),count,wfp);
		//执行成功后关闭源文件以及被写入文件
		fclose(rfp);
		fclose(wfp);
		sleep(2);
		printf("拷贝文档后部分内容\n");
		//退出老大进程
		exit(EXIT_SUCCESS);
	}
	else if(pid1>0)
	{
		//创建一个子进程
		pid_t pid2=fork();
		if(pid2==0)
		{
			printf("我是老二\n");
			printf("拷贝文档前一部分内容\n");
			//定义追加写的形式打开文件
			FILE *wfp=NULL;
			if((wfp=fopen(argv[2],"a"))==NULL)
			{
				perror("wfp error");
				return -1;
			}
			//bzero(清零的地址,空间字节数)
			//防止buf中有内容影响操作
			bzero(buf,sizeof(buf));	//清零buf
			//由于读文件已经打开,故需要把光标定位到开头
			fseek(rfp,0,SEEK_SET); //光标定位开头
			//由于需要限制位置,所以使用fread函数来进行读取
			int count=fread(buf,sizeof(buf[0]),num/2,rfp);
			//写入使用fwrite函数
			fwrite(buf,sizeof(buf[0]),count,wfp);
			//关闭被写入文件
			fclose(wfp);
			sleep(5);
			printf("拷贝前一部分内容完成\n");
			//退出进程老二
			exit(EXIT_SUCCESS);
		}
		else if(pid2>0)
		{
			printf("我是父进程,我来收回资源\n");
			printf("我是父进程,我的第一个子进程pid:%d,第二个为:\
			%d\n", pid1, pid2);
			wait(NULL);
			wait(NULL);
			printf("孩子都死了,不活了\n");
		}
		else
		{
			perror("fork error");
			return -1;
		}

	}
	else 
	{
		perror("fork error");
		return -1;
	}
	return 0;
}

运行效果:

进程五种状态转换图

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

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

相关文章

GROUP_CONCAT报错解决

有如下表 其中awardee和awardee_unit都是保存的json类型的字符串, awardee是多个人员id, awardee_unit是部门的全路径 查询时要注意转换 需要将name拼接起来合并成一行,直接 GROUP_CONCAT 会报错 百度的大部分答案是修改数据库配置去掉严格模式,如果不方便修改数据库可以这样…

kubernetes(三)

文章目录 1. k8s弹性伸缩1.1 安装heapster监控1.2 弹性伸缩使用和验证 2. 持久化存储2.1 emptyDir 1. k8s弹性伸缩 k8s弹性伸缩&#xff0c;需要附加插件heapster 1.1 安装heapster监控 使用heapster(低版本)可以监控pod压力大不大 使用hpa调节pod数量&#xff0c;自动扩容或…

应用案例——音箱系统的芯片组成

人类的语言交流是人类交互的主要方式&#xff0c;从键盘&#xff0c;鼠标&#xff0c;触屏控制&#xff0c;人机交互的本质始终没有改变&#xff0c;无法完成对话式的交流&#xff0c;而语音交互的出现打破了这一现状&#xff0c;它可以解放双手&#xff0c;甚至解放双眼&#…

双碳目标---碳储量、碳收支、碳循环

以全球变暖为主要特征的气候变化已成为全球性环境问题&#xff0c;对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

C练习——定期存取并行

题目&#xff1a;假设银行一年整存零取的月息为1.875%&#xff0c;现在某人手头有一笔钱&#xff0c;他打算在今后5年 中&#xff0c;每年年底取出1000元作为孩子来年的教育金&#xff0c;到第5年孩子毕业时刚好取完这笔钱&#xff0c;请编 程计算第1年年初时他应存入银行多少钱…

基于EMD-SpEn(样本熵)联合小波阈值去噪

代码原理 基于 EMD-SpEn&#xff08;样本熵&#xff09;联合小波阈值去噪方法是一种用于信号降噪的信号处理方法&#xff0c;它结合了经验模态分解 (EMD)、样本熵 (SpEn) 和小波阈值处理技术。 首先&#xff0c;使用 EMD 将原始信号分解为一组称为经验模态函数 (IMFs) 的信号…

基于SpringBoot的在线考试系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现在线考试的信息化管理。则对于进一步提高在线考试管理发展&#xff0c;丰富在线考试管理经验能起到不少的促进作用。 在线考试系统能够通…

未来已来,Ai原生应用与人高度结合!学习就在现在?

原生应用&#xff1a;OpenAI™ChatGPT、Baidu.Inc™文心一言 也可以体验CSDN的INSCODE AI&#xff0c;集成多个国内GPT内容。 文章目录 前言----编程语言的未来&#xff1f;一、编程语言的教育1.1 学校所见所闻1.2 开启我们的Ai行程~io&#xff01;1.3 Ai结果评论 二、Ai编程教…

Linux-进程间通信_管道

项目场景&#xff1a; 须熟知文件管理和进程方面的基础知识 通过Xshell和VScode 相互进行远程开发&#xff0c;学习进程间通信的其中一种方式——管道。 问题描述 依照我们曾经所学的知识&#xff0c;我们仅仅只能在单个进程中进行数据的交互&#xff0c;但是在实际应用中&a…

树莓派外设开发综述及WiringPi库安装

树莓派常用的接口 IO&#xff1a; input&#xff1a; output&#xff1a; PWM&#xff1a; IIC spi uart WiringPi库 树莓派一个非常重要的 WiringPi库&#xff08;Linux下 动态库 ”.so“ 静态库”.a"&#xff09; &#xff08;是一个特定平台&#xff0c;特…

【Jasypt】SpringBoot配置文件加密

1、加密介绍 在yml配置文件中会存在一些敏感数据&#xff0c;比如用户名&#xff0c;密码&#xff0c;第三方应用的密钥等等。这些信息是以明文的形式出现在文件中&#xff0c;存在较大安全隐患。Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个Java库&#…

秋招复习之数组与链表

目录 前言 1 数组 初始化数组&#xff1a; 访问元素 插入元素 删除元素 遍历数组&#xff1a; 查找元素 扩容数组&#xff1a; 数组的优点与局限性 2 链表 初始化链表 插入节点 删除节点 访问节点 查找节点 数组 vs. 链表 常见链表类型 3 列表 初始化列表 访问元素 插入与删…

Vue 单文件组件的基础入门指南

本文是我2年前做的一个学习小demo&#xff0c;在这里分享一下 希望对想要学习Vue的小伙伴能有一丢丢的小帮助~_~ 1 Vue CLI Vue CLI (opens new window)是一个基于Vue.js进行快速开发的完整系统。 这里我使用 Vue CLI 生成了一个Vue项目&#xff0c;命令为&#xff1a;vue cr…

高效工具汇总,让学习和办公飞起来

目录 1、寻找论文&#xff0c;效率很高2、学习各类编程的地方 1、寻找论文&#xff0c;效率很高 AMiner&#xff0c;由清华大学计算机科学与技术系的唐杰教授团队开发的一个显著的学术搜索和挖掘系统。系统提供了一整套功能以协助学术研究&#xff0c;包括研究人员档案、专家搜…

JAVA的引用与C++的指针有什么区别

JAVA的引用与C的指针有什么区别 1. Java值类型与引用类型1.1 变量初始化1.2 变量赋值1.3 函数传参 2. Java数据存储方式2.1 Java局部变量&&Java方法参数2.2 Java数组类型引用和对象2.3 String类型数据 3. Java引用类型3.1 强引用3.2 软引用3.3 弱引用3.4 虚引用 4. JAV…

SpringBoot启动时执行初始化操作还只会用@PostConstruct?进来看看其它方式~

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

网易云商冯旻伟:“大模型是下一代信息系统的大脑”

编者按 AIGC时代&#xff0c;大模型在智能客服领域的应用一直备受关注&#xff0c;其不断演进的技术给用户体验和业务效率带来了全新的可能性。 近日&#xff0c;我们有幸采访了网易云商AI技术线的负责人冯旻伟&#xff0c;深入了解了他们在智能客服方面的创新和实践。从文字交…

grep笔记240103

常用选项&#xff1a;&#xff1a; -i&#xff1a;忽略大小写进行匹配。 -v&#xff1a;反向匹配&#xff0c;只打印不匹配的行。 -n&#xff1a;显示匹配行的行号。 -r&#xff1a;递归查找子目录中的文件。 -l&#xff1a;只打印匹配的文件名。 -c&#xff1a;只打印匹配的行…

打造专属个人或企业知识付费平台,核心功能设计

在当今数字化时代&#xff0c;知识付费市场正在迅速崛起&#xff0c;而私域流量的概念也日益受到重视。私域流量指的是企业通过自有渠道获取的、能够自由支配的流量&#xff0c;这种流量具有更高的用户粘性和转化率。因此&#xff0c;打造一个基于私域流量的知识付费小程序平台…

【响应式编程-03】常见的函数式接口

一、简要描述 使用Lambda的前提 必须有一个函数式接口: 有且只有一个抽象方法的接口 FunctionnalInterface注解 常见的函数式接口 Runnable / CallableSupplier / ConsumerComparatorPredicateFunction 二、代码实现 1、Runnable - RunnableLambda测试类 package tech.flygo.…