IO进程线程Day4

news2024/11/27 8:46:11

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

#include <myhead.h>
//使用三个进程完成两个文件的拷贝工作
//两个子进程分别拷贝文件的上下两部分
//父进程回收资源

int main(int argc, const char *argv[])
{
	//判断外部传参
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usage: ./a.out inputfile outfile\n");
		return -1;
	}

	int srcfd=-1,dstfd=-1,fd=-1;
	char buf[10]="";

	//计算文件中间的位置
	if((fd=open(argv[1],O_RDONLY))==-1)
	{
		perror("open file error");
		return -1;
	}
	int pos=lseek(srcfd,0,SEEK_END)/2;

	//创建第一个子进程
	pid_t pid1=-1;
	pid1=fork();

	if(pid1 == 0)  
	{
		printf("我是老大,我来拷贝上半部分\n");
		//打开源文件
		if((srcfd=open(argv[1],O_RDONLY))==-1)
		{
			perror("1 open srcfile error");
			return -1;
		}
		//打开目标文件
		if((dstfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
		{
			perror("1 open dstfile error");
			return -1;
		}
		//拷贝
		int count=0;
		while(1)
		{
			memset(buf,0,sizeof(buf));
			int res=read(srcfd,buf,sizeof(buf));
			write(dstfd,buf,res);
			count+=res;
			if(count>=pos)
			{
				break;
			}
		}
			//关闭
			close(srcfd);close(dstfd);
			printf("上半部分拷贝完成\n");
			exit(EXIT_SUCCESS);
		
	}else if(pid1 > 0)
	{
		//创建第二个子进程
		pid_t pid2=fork();
		if(pid2 == 0)
		{
			printf("我是老二,我来拷贝下半部分\n");
			//打开源文件
			if((srcfd=open(argv[1],O_RDONLY))==-1)
			{
				perror("2 open srcfile error");
				return -1;
			}
			//打开目标文件
			if((dstfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
			{
				perror("2 open dstfile error");
				return -1;
			}
			//偏移光标
			lseek(srcfd,pos,SEEK_SET);

			//拷贝
			while(1)
			{
				memset(buf,0,sizeof(buf));
				int res=read(srcfd,buf,sizeof(buf));
				write(dstfd,buf,res);
				if(res==0)
					break;
			}
			//关闭
			close(srcfd);close(dstfd);
			printf("下半部分拷贝完成\n");
			sleep(3);
			exit(EXIT_SUCCESS);
		}else if(pid2 > 0)
		{
			printf("我是父进程\n");
			sleep(5);
			wait(NULL);
			printf("回收一个子进程\n");
			wait(NULL);
			printf("回收一个子进程\n");
		}else
		{
			perror("fork2 error");
			return -1;
		}
	}else
	{
		perror("fork1 error");
		return -1;
	}
	return 0;
}

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

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

相关文章

Azure Machine Learning - 人脸识别任务概述与技术实战

Azure AI 人脸服务提供了可检测、识别和分析图像中的人脸的 AI 算法。 人脸识别软件在许多不同情形中都十分重要&#xff0c;例如识别、无接触访问控制和实现隐私的人脸模糊。你可以通过客户端库 SDK&#xff0c;或者直接调用 REST API 使用人脸服务。 目录 一、人脸识别服务场…

AspectJ入门(二)— 应用

AspectJ便于调试、测试和性能调整工作。定义的行为范围从简单的跟踪到分析&#xff0c;再到应用程序内部一致性到测试。AspectJ可以干净地模块化这类功能&#xff0c;从而可以在需要时轻松地启用和禁用这些功能。 1 基础 本节将继续介绍AspectJ到一些基础功能&#xff0c;为后…

【量化金融】《证券投资学》吴晓求(第四版)(更新中)

这里写目录标题 第一篇 基本知识第1章 证券投资工具名词解释简答题 第2章 证券市场名词解释简答题 第二篇 基本分析第三篇 技术分析第四篇 组合管理第五篇 量化分析与交易策略 第一篇 基本知识 第1章 证券投资工具 名词解释 风险&#xff08;risk&#xff09; 未来结果的不…

半年没涨薪了,原来忽略了这个职场技巧

大家好&#xff0c;我是木川 说到职场&#xff0c;大家都想爬得高一些&#xff0c;赚得多一些对吧&#xff1f;这时候&#xff0c;“向上管理”就显得特别重要了。 其实这就是个高级点的说法&#xff0c;意思就是怎么跟老板打好关系&#xff0c;让自己在工作上更顺利。 一、成功…

【KingbaseES】实现MySql函数WEERDAY

CREATE OR REPLACE FUNCTION weekday(date_val date) RETURNS integer AS $$ BEGIN RETURN EXTRACT(ISODOW FROM date_val); END; $$ LANGUAGE plpgsql IMMUTABLE;

从0开始python学习-39.requsts库

目录 HTTP协议 1. 请求 2. 响应 Requests库 1. 安装 2. 请求方式 2.1 requests.请求方式(参数) 2.2 requests.request() 2.3 requests.session().request() 2.4 三种方式之间的关联 3. 请求参数 3.1 params&#xff1a;查询字符串参数 3.2 data&#xff1a;Form表单…

自然语言转SQL,一个微调ChatGPT3.5的实例(下)--模型微调及模型性能

提交训练集进行微调 一旦我们创建了JSONL文件&#xff08;可以在这里或ipfs_here找到一个小样本&#xff09;&#xff0c;下一步是使用以下命令将创建的文件上传到OpenAI&#xff1a; openai.api_key os.getenv("OPENAI_API_KEY") print(openai.File.create(fileo…

Spark内核解析-Spark shuffle6(六)

1、Spark Shuffle过程 1.1MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌、混洗&#xff0c;把一组有一定规则的数据尽量转换成一组无规则的数据&#xff0c;越随机越好。MapReduce中的Shuffle更像是洗牌的逆过程&#xff0c;把一组无规则的数据尽量转换成一组具有一定规则…

mycat 安装和水平分表

1.拉取需要创建docker版的mycat资源 # 下载对应的资源 git clone https://github.com/ruanjiayu/docker.mycat # 进入docker.mycat cd /home/cluster/mycat/docker.mycat # 构建镜像 docker-compose build 2.修改配置 vim config/mycat/schema.xml <?xml version"…

Mac M1 Parallels CentOS7.9 Install Parallels Tools

一、挂载parallels-tools安装包 mkdir /media/cdrom/ mount /dev/cdrom /media/cdrom/ mount: /dev/sr0 写保护&#xff0c;将以只读方式挂载二、GCC升级 yum install -y centos-release-scl yum install -y devtoolset-8-gcc*# 切换当前会话中gcc版本为8 scl enable devtool…

【OJ比赛日历】快周末了,不来一场比赛吗? #01.06-01.12 #10场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2024-01-06&#xff08;周六&#xff09; #4场比赛2024-01-07…

Unity3D入门基础知识汇总

1、参考链接 01.游戏引擎是啥玩意&#xff1f;_哔哩哔哩_bilibili 2、unity概念 它是一套具有完善体系与编辑器的跨平台游戏开发工具&#xff0c;也称之为游戏引擎。游戏引擎是指一些编写好的可重复利用的代码与开发游戏所用的各功能编辑器。 3、unity界面 右上边可以切换布局…

图像评价指标PSNR、SSIM、LPIPS、FID(接上篇,这篇主要讲FID)

关于FID的计算&#xff0c;这里我直接使用startGANv2中的计算FID的方法&#xff0c;比较简单&#xff0c;快速。理论部分我就不讲了&#xff0c;网上一搜一大堆&#xff0c;我写的都是干货&#xff08;主要是怕太长了&#xff0c;没人看&#x1f602;&#xff09; 上一篇是关于…

苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点

Bartender mac是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标&#xff0c;从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏&#xff1a;Bartender 允许用户隐藏菜单栏图标&#xff0c;只在需要时显示。这样可以…

【React系列】网络框架axios库的使用

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. axios库的基本使用 1.1. 网络请求的选择 目前前端中发送网络请求的方式有很多种&#xff1a; 选择一:传统的Aj…

指令周期流程图相关题目

已知CPU结构如下图所示&#xff0c;其中包括一个累加器AC、一个状态寄存器和其他几个寄存器。各部分之间的连线表示数据通路&#xff0c;箭头表示信息传递方向。试完成以下工作&#xff1a;①写出图中四个寄存器A、B、C、D的名称和作用&#xff1b;②简述完成指令ADD Y的数据通…

一篇文章学会Vim

一篇文章学会Vim 声明&#xff1a;以下内容均为我个人的理解&#xff0c;如果发现错误或者疑问可以联系我共同探讨 简介 Vim是一个高度可定制的终端文本编辑器&#xff0c;它可以很方便的创建和修改任何类型的文本。作为vi的升级版&#xff0c;有许多新的特性(以下列出的特性…

C# 使用Microsoft消息队列(MSMQ)

写在前面 Microsoft Message Queuing (MSMQ) 是在多个不同的应用之间实现相互通信的一种异步传输模式&#xff0c;相互通信的应用可以分布于同一台机器上&#xff0c;也可以分布于相连的网络空间中的任一位置。 使用消息队列可以实现异步通讯&#xff0c;无需关心接收端是否在…

CentOs搭建Kafka集群

Centos7搭建Kafka集群 一、集群规划二、环境准备三、安装kafka集群1、下载kafka安装包2、解压3、配置环境变量4、编辑配置文件①修改broker.id②配置kafka运行日志路径③配置Zookeeper集群地址 5、启动集群6、测试kafka①、创建topic②、查看当前服务器中的所有topic③、生产者…

算法导论复习——CHP16 贪心算法

定义 每一步都做出当前看来最优的操作。 问题引入——活动选择问题 问题描述 活动选择问题就是对给定的包含n个活动的集合S&#xff0c;在已知每个活动开始时间和结束时间的条件下&#xff0c;从中选出最多可兼容活动的子集合&#xff0c;称为最大兼容活动集合。 不失一般性&a…