1.4 day4 IO进程线程

news2024/11/19 13:20:59

使用两个子进程进行文件拷贝,父进程进行资源回收

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建一个文件描述符并以只读的方式打开
	int fd=-1;
	if((fd=open("./test.bmp",O_RDONLY))==-1)
	{
		perror("open error");
		return -1;
	}
	//使用lseek计算数据大小,确定数据的中心位置
	int len=(lseek(fd,0,SEEK_END))/2;
	close(fd);

	
	int pid=-1;
	int res;//将读取到的数据存入res中
	int sum=0;//计算已经读取了多少
	char buf[128]="";//定义一个存放数据的容器
	
	//创建一个子进程1,拷贝一半文件
	pid=fork();
	if(pid==0)
	{
		//子进程
		//以只读的方式打开源文件,再以只写的方式打开目标文件
		int fd=-1;
		int cfd=-1;
		if((fd=open("./test.bmp",O_RDONLY))==-1)
		{
			perror("open error");
			return -1;
		}
		if((cfd=open("./aa.bmp",O_WRONLY|O_CREAT,0664))==-1)
		{
			perror("open error");
			return -1;
		}
		//将光标定位到相同位置
		lseek(fd,0,SEEK_SET);
		lseek(cfd,0,SEEK_SET);
		//循环将读取到的数据写入目标文件内
		while((res=read(fd,buf,sizeof(buf)))!=0)
		{
			//计算已经读取了多少,如果读取到的数据等于或超过一半则退出循环
			sum+=res;
			if(sum>=len)
			{
                write(cfd,buf,res-(sum-len));
				break;
			}
			write(cfd,buf,res);
		}
		//关闭文件描述,以及子进程1
		close(fd);
		close(cfd);
		exit(EXIT_SUCCESS);

	}else if(pid>0)
	{
		//创建一个新的子进程2
		int pid2=-1;
		pid2=fork();
		if(pid2==0)
		{
			//子进程2
			//重复子进程1的操作
			int fd=-1;
			int cfd=-1;
			if((fd=open("./test.bmp",O_RDONLY))==-1)
			{
				perror("open error");
				return -1;
			}
			if((cfd=open("./aa.bmp",O_WRONLY|O_CREAT,0664))==-1)
			{
				perror("open error");
				return -1;
			}

			//将两个文件的光标定位到中间-1的位置
			lseek(fd,len-1,SEEK_SET);
			lseek(cfd,len-1,SEEK_SET);
			while((res=read(fd,buf,sizeof(buf)))!=0)
			{
				write(cfd,buf,res);
			}
			close(fd);
			close(cfd);
			exit(EXIT_SUCCESS);
		}else if(pid2>0)
		{
			//父进程
			//阻塞回收子进程1和子进程2
			wait(NULL);
			wait(NULL);
		}else
		{
			perror("fork error");
			return -1;
		}
		printf("拷贝完成\n");
	}
	return 0;
}

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

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

相关文章

私有云平台搭建openstack和ceph结合搭建手册

OpenStack与云计算 什么是云&#xff1f; 如何正确理解云&#xff0c;可以从以下几个方面。 云的构成。 用户&#xff1a;对用户而言是透明无感知的&#xff0c;不用关心底层构成&#xff0c;只需要知道利用云完成自己任务即可。 云提供商&#xff1a;对云资产管理和运维。 云…

高并发下的计数器实现方式:AtomicLong、LongAdder、LongAccumulator

一、前言 计数器是并发编程中非常常见的一个需求&#xff0c;例如统计网站的访问量、计算某个操作的执行次数等等。在高并发场景下&#xff0c;如何实现一个线程安全的计数器是一个比较有挑战性的问题。本文将介绍几种常用的计数器实现方式&#xff0c;包括AtomicLong、LongAd…

工业城市的废水监控系统

前言 很多工业城市的废水排放量较大&#xff0c;已造成城市地表水的严重污染。各城市的环境监测中心站肩负着对城市地表环境水质及污染源排放废水的监测工作&#xff0c;很多城市相继形成了以市站为网头&#xff0c;与区站、行业站构成一体的废水监测网。 为提高水质监测能力建…

【Java】RuoYi-Vue-Plus 多数据源整合TDengine时序数据库——服务端自动建库建表

目录 环境准备整合TDengine 数据源1. 添加驱动依赖2. 添加数据源配置3. 添加Mapper4. 添加建表sql脚本5. Controller 测试效果 环境准备 RuoYi-Vue-Plus v5.1.2JDK17Maven 3.6.3Redis 5.XMySQL 5.7TDengine 2.6.0.34 客户端 整合TDengine 数据源 1. 添加驱动依赖 注意&…

redis安装与配置

目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本&#xff1a; 3. 安装 …

Python接口自动化 —— 什么是接口测试、为什么要做接口测试(详解)

什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。  一般来说&#xff0c;测试接…

pod进阶版(2)

startupProbe启动探针 如果探测失败,pod的状态是notready&#xff0c;启动探针会重启容器 启动探针没有成功之前&#xff0c;后续的探针都不会执行。启动探针成功之后&#xff0c;在pod的后续生命周期不会用启动探针 exec方式 正确示范 apiVersion: v1 kind: Pod metadata…

linux 使用log4cpp记录项目日志

为什么要用log4cpp记录项目日志 在通常情况下&#xff0c;Linux/UNIX 每个程序在开始运行的时刻&#xff0c;都会打开 3 个已经打开的 stream. 分别用来输入&#xff0c;输出&#xff0c;打印错误信息。通常他们会被连接到用户终端。这 3 个句柄的类型为指向 FILE 的指针。可以…

MobaXterm SSH 免密登录配置

文章目录 1.简介2.SSH 免密登录配置第一步&#xff1a;点击 Session第二步&#xff1a;选择 SSH第三步&#xff1a;输入服务器地址与用户名第四步&#xff1a;设置会话名称第五步&#xff1a;点击 OK 并输入密码 3.密码管理4.小结参考文献 1.简介 MobaXterm 是一个功能强大的终…

shell,对输出的结果去掉空格和换行符号,grep忽略特定字符

对原始的执行命令&#xff0c;直接后面加 |tr -d \n | tr -d |tr -d \n 用来去除换行符 |tr -d 用来出去空格 grep去除特定的字符的行&#xff0c;直接 -v&#xff0c;后接字符。比如&#xff1a; 现在设法去掉含有"ini"的行&#xff0c;执行&#xff1a; …

对象克隆学习

假如说你想复制一个简单变量。很简单&#xff1a; int apples 5; int pears apples; 不仅仅是int类型&#xff0c;其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象&#xff0c;情况就有些复杂了。 …

美洽获评2023年度“最佳数字化服务商”,产品优势赋能企业智能转型

日前&#xff0c;由知名学习交流平台人人都是产品经理举办的“2023年度评选”活动圆满落幕&#xff0c;美洽凭借在企业服务领域的技术实力与优秀实践成果脱颖而出&#xff0c;入围年度产品评选榜单&#xff0c;获评2023年度“最佳数字化服务商”。 人人都是产品经理成立于2010年…

邮件营销发件人名称设置指南:提升邮件信誉度与点击率的技巧

正如品牌名称之于产品&#xff0c;发件人名称之于电子邮件。它有助于提高识别度、熟悉度和清晰度。一封邮件的发件人名称可以是话题的开端&#xff0c;也可以是邮件内容的破坏者。 关于电子邮件的发件人名称&#xff0c;你可能经常不得不思考两件事。 我应该用什么名字&#…

怎么分解一张二维码图片?二维码解码在线处理技巧

相信对于制作二维码很多小伙伴还知道怎么操作&#xff0c;那么分解二维码图片的方法有知道的吗&#xff1f;二维码解码也是在日常生活中经常会需要使用的一个功能&#xff0c;当我们需要将一张图片上的二维码分解使用时&#xff0c;那么最方便快捷的方法就是使用二维码解码器工…

【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(1)

前言 大联大世平集团推出了一款基于 NXP 车规级 MCU S32K344 的开发板——花名“Cavalry”&#xff0c;它使用 BGA257 封装的 32 位 ArmCortex-M7 S32K344 作为主控芯片&#xff0c;在69.6*130mm 的小体积开发板上搭载了 SBC 电源管理芯片、CAN 收发器、LIN 收发器、FLASH 存储…

Rhinoceros 8.2(犀牛8.2)安装教程

Rhinoceros 8.2下载链接&#xff1a;https://docs.qq.com/doc/DUmhMYmNyUGl6ZVpU 1.选中下载的压缩包&#xff0c;右键解压到“Rhinoceros 8.2”文件夹 2.选中“rhino_en-us_8.2.23346.13001.exe”右键以管理员身份运行 3.点击“小齿轮“ 4.选择安装路径&#xff0c;取消勾选“…

计算机视觉与美颜SDK:详解人脸美型功能的实现过程

众所周知。人脸美型功能作为美颜技术的一项关键特性&#xff0c;对于用户塑造理想形象具有重要意义。本文将深入探讨计算机视觉与美颜SDK中人脸美型功能的实现过程。 一、关键点定位 关键点定位是人脸美型的关键步骤之一。深度学习方法在关键点定位方面取得了巨大的成功&…

已知输入图像大小为n、卷积核大小为f、卷积步长s,填充大小为p,求解输出图像大小。

问题描述&#xff1a;已知输入图像大小为n、卷积核大小为f、卷积步长s&#xff0c;填充大小为p&#xff0c;求解输出图像大小。 问题解答&#xff1a; 输出图像的大小可以使用以下的计算公式确定&#xff1a; 为了举例说明&#xff0c;假设有以下参数&#xff1a; 输入图像大…

【前端】[vue3] vue-router使用

提示&#xff1a;我这边用的是typeScript语法&#xff0c;所以js文件的后缀都是ts。 安装vue-router&#xff1a; &#xff08;注意&#xff1a;vue2引用vue-router3 vue3才引用vue-router4&#xff09; npm install vue-router4src文件夹下面创建 router/index.ts&#xff08;…

如何在CentOS7部署宝塔面板并通过内网穿透实现远程登录面板

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具&#xff0c;适合新手&#xff0c;简单好用。当我们在家里/公司搭建了宝塔&#xff0c;没有公网IP&#xff0c;但是想要在外也可以访问内…