1.4 day4 IO进程线程

news/2024/7/8 0:16:08

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

#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://lihuaxi.xjx100.cn/news/1938501.html

相关文章

212.【2023年华为OD机试真题(C卷)】堆内存申请(排序和贪心算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-堆内存申请二.解题思路三.题解代码Python题解代…

罗德与施瓦茨FSVA40信号和频谱分析仪

罗德与施瓦茨FSVA40是一款功能信号和频谱分析仪&#xff0c;适用于从事射频系统的开发、生产、安装和服务的用户。FSVA40信号和频谱分析仪系列始终提供最佳的价格和性能组合&#xff0c;无论是根据最新通信标准测试生产中的无线设备&#xff0c;还是测量低相位噪声、高灵敏度和…

[每周一更]-(第80期):分析源码flag,配合示例展示用法

Go 语言标准库中的 flag 包提供了一套简单而又强大的命令行参数解析工具。以下是对 flag 包源码的一些关键点的解析&#xff1a; FlagSet 结构体&#xff1a; FlagSet 是 flag 包的核心结构体&#xff0c;用于表示一组命令行参数。它包含了一个存储命令行参数的 map&#xff…

剧本杀小程序/APP搭建,增加玩家游戏体验

近年来&#xff0c;剧本杀游戏成为了年轻人娱乐的新方式&#xff0c;受到了年轻人的追捧。 剧本杀是一种新型的社交游戏&#xff0c;在游戏中&#xff0c;玩家不仅可以进行角色扮演&#xff0c;也能够交到好友&#xff0c;符合当下年轻人的生活模式。 小程序、app是当下剧本杀…

【python】爬取豆瓣电影排行榜Top250存储到Excel文件中【附源码】

一、背景 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程 序&#xff0c;用于抓取豆瓣电影Top250的相关信息&#xff0c;并将其保存为Excel文件。 程序包含以下几个部分&#xff1a; 导入模块&#xff1a;程序导入了 …

C++精进之路(十六)string类和标准模板库

C提供了一组功能强大的库&#xff0c;这些库提供了很多常⻅编程问题的解决方案以及简化其他问题的工具。 string 类为将字符串作为对象来处理提供了一种方便的方法。string 类提供了自动内存管理功能以及众多处 理字符串的方法和函数。例如&#xff0c;这些方法和函数让您能够合…

Activiti7官方在线流程设计器下载和部署

文章目录 一、流程设计器下载二、流程设计器简单运行三、流程设计器简单使用四、流程设计器持久化持久化会遇到的常见错误 五、流程设计器汉化说明菜单汉化操作汉化 参考文档 一、流程设计器下载 官网下载地址&#xff1a;https://www.activiti.org/get-started 点击直接获取官…

数据资产入表正式施行,企业如何对数据资产进行会计核算?

2024年1月1日&#xff0c;《企业数据资源相关会计处理暂行规定》正式施行&#xff0c;数据资源将作为资产在企业的会计和财务报告中确认、计量、报告和披露。这代表着企业数据相关的支出由损益变成资产类&#xff0c;可以计入资产&#xff0c;不仅可以减少投入期对利润的影响&a…