IO / day04 作业

news2025/2/25 8:26:19

1.使用两个子进程完成两个文件的拷贝,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程用于回收两个子进程的资源

代码

#include <myhead.h>

int main(int argc, const char *argv[])
{
	if(argc<3)
	{
		printf("input error\n");
		printf("usage: ./a.out src dest\n");
		return -1;
	}

	char psrc[256]="./"; // src
	strcat(psrc, argv[1]);
	printf("psrc=%s\n", psrc);

	char pdest[256]="./"; //dest
	strcat(pdest, argv[2]);
	printf("pdest=%s\n", pdest);

	struct stat stbuf;
	int fsize=0;
	stat(psrc, &stbuf);
	fsize = stbuf.st_size; // get file size

	int rpid1=-1; 

	rpid1=fork(); // 

	if(rpid1 > 0)
	{
		int rpid2 = -1;

		rpid2 = fork();

		if(rpid2>0)
		{
			//printf("I am parent process\n");
			//printf("my 1st child process pid=%d\n", rpid1);
			//printf("my 2nd child process pid=%d\n", rpid2);

			//recycle child process resources
			wait(NULL);
			wait(NULL);

		}else if(rpid2==0)
		{ // child process copy 1st half of file
			int fdr1;
			int fdw1;

			int count1 = 0;
			char buf1[128]="";

			if( (fdr1=open(psrc, O_RDONLY)) == -1 )
			{
				perror("p1 src open error;");
				return -1;
			}

			if( (fdw1=open(pdest, O_WRONLY|O_CREAT , 0777 )) == -1 )
			{
				perror("p1 dest open error;");
				return -1;
			}

			lseek(fdw1, 0, SEEK_SET);

			while(1)
			{

				int res1 = read(fdr1, buf1, sizeof(buf1));	
				//printf("res1=%d, buf1=%s", res1, buf1 );
				if(count1 + res1>=fsize/2) // read to the last time
				{
					write(fdw1, buf1, fsize/2-count1);
					break;

				}
				else
				{
					write(fdw1, buf1, res1);

				}

				lseek(fdw1, res1, count1); // move cursor to next one
				count1+=res1;


			}

			close(fdr1); // close fd
			close(fdw1);


			printf("I am the 2nd child process\n");
			//exit process
			exit(EXIT_SUCCESS);


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

		}

	}else if(rpid1==0)
	{
		// child process copy 1st half of file



		int fdr2;
		int fdw2;

		int count2 = 0;
		char buf2[128]="";

		if( (fdr2=open(psrc, O_RDONLY)) == -1 )
		{
			perror("p2 src open error:");
			return -1;
		}

		if( (fdw2=open(pdest, O_WRONLY|O_CREAT ,0777 )) == -1 )
		{
			perror("p2 src open error;");
			return -1;
		}

		lseek(fdr2, (fsize/2+1), SEEK_SET); // move cursor to 2nd half
		lseek(fdw2, (fsize/2+1), SEEK_SET); // move cursor to 2nd half

		while(1)
		{

			int res2 = read(fdr2, buf2, sizeof(buf2));	
			printf("res2=%d, buf2=%s", res2, buf2 );

			if(count2 + res2>=fsize)
			{
				write(fdw2, buf2, fsize- (fsize/2)-count2);
				break;

			}
			else
			{
				write(fdw2, buf2, res2);

			}

			lseek(fdr2, res2+count2, SEEK_SET); // move cursor to next read postion
			lseek(fdw2, res2+ count2, SEEK_SET);

			count2+=res2;


		}

		close(fdr2); // close fd
		close(fdw2);

		printf("I am the 1st child process!\n");
		//exit
		exit(EXIT_SUCCESS);


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

	}

	return 0;
}

运行结果

ubuntu@ubuntu:~/embedded/04_io/day04$ ./a.out test.txt test.bk.txt

-rwxrwxr-x 1 ubuntu ubuntu      32 12月  6 20:20 test.bk.txt
-rw-rw-r-- 1 ubuntu ubuntu      32 12月  6 19:37 test.txt

2.思维导图

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

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

相关文章

Python代码将txt里面多行json字符串转成excel文件

python 代码 将txt里面的多行json字符串转成excel history.txt文件json代码样例 Json转换Excel代码 import json import pandas as pddef json_out(file_path,excel_path):all_list[]with open(file_path, "r", encodingutf-8) as f:for line in f:all_list.append…

Linux动态库常见问题

1.编译好库后&#xff0c;应用程序调用&#xff0c;路径明明写对了&#xff0c;但是编译的时候却显示xxx未定义 2.编译好了却说不能打开动态库&#xff0c;没有此文件 ./jrtplib_test: error while loading shared libraries: libjrtp.so.3.11.2: cannot open shared object f…

【LeetCode热题100】【滑动窗口】无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…

11.机器人系统仿真搭建gazebo环境、仿真深度相机、雷达、RGB相机

目录 1 gazebo仿真环境搭建 1.1 直接添加内置组件创建仿真环境 1.2 urdf、gazebo、rviz的综合应用 2 ROS_control 2.1 运动控制实现流程(Gazebo) 2.1.1 已经创建完毕的机器人模型&#xff0c;编写一个单独的 xacro 文件&#xff0c;为机器人模型添加传动装置以及控制器 …

Kontakt v7.7.2(音频采样器)

Native Instruments Kontakt 7是一款强大的软件采样器&#xff0c;它允许用户从各种来源采样音频并进行编辑和处理。它包含大量预设采样库&#xff0c;包括乐器、合成器、鼓组和声音效果等。此外&#xff0c;Kontakt 7还允许用户创建自己的采样库&#xff0c;以便根据自己的需要…

Java异常讲解

&#x1f435;本篇文章将对异常相关知识进行讲解 一、异常的结构 在程序执行的过程中出现的一些问题叫做异常&#xff0c;异常其实是一个一个类&#xff0c;每一种异常都代表一个类 1.1 几种常见的异常 System.out.println(10/0); //算数异常 //Exception in thread "m…

QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』

前文链接&#xff1a;QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』 前一篇文章提到的异步单瓦片加载&#xff0c;是指线程每准备好一个瓦片数据后&#xff0c;立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后&#xff0c;一起抛出信号让…

flink中处理kafka分区的消息顺序

背景 kafka分区的消息是有序的&#xff0c;那么flink在消费kafka分区的时候消息的顺序是怎么样的呢&#xff1f;还能保持这个有序性吗&#xff0c;本文就来记录下 flink消费kafka分区的顺序性 从上图可知&#xff0c;flink的转换算子比如map&#xff0c;flatMap&#xff0c;f…

D. In Love

贪心&#xff0c;维护最靠左的右端点以及最靠右的左端点 // Problem: D. In Love // Contest: Codeforces - Codeforces Round 905 (Div. 3) // URL: https://codeforces.com/contest/1883/problem/D // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Edi…

C语言--每日练习题--Day38

第一题 1. 下列代码的运行结果&#xff08;&#xff09; short i 65537; int j i 1; printf("i%d,j%d\n", i, j); A&#xff1a;i 65537&#xff0c;j 65538 B&#xff1a;i 1&#xff0c;j 2 C&#xff1a;i -1&#xff0c;j 0 D&#xff1a;i 1&#xff…

多向通信----多人聊天

package 多人聊天; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; publ…

Xcode15 Library ‘iconv.2.4.0‘ not found

Xcode 15运行老代码报错&#xff1a;Library iconv.2.4.0 not found 解决&#xff1a; TARGETS-->Bulid Phases --> Link Binary With Libraries 添加一个“Libiconv.tbd”, 同时把原来的 “libiconv.2.4.0.tbd”删除&#xff08;一定要删除&#xff0c;不然运行还是…

微服务开发:断路器详解

微服务是目前业界使用的最重要的实现方面。通过使用微服务架构&#xff0c;开发人员可以消除他们以前在单体应用程序中遇到的许多问题。展望未来&#xff0c;人们开始在微服务中搜索和采用各种模式。大多数时候&#xff0c;新模式的产生是为了解决另一个模式中出现的常见问题。…

ahk系列-windows超级运行框-表达式计算(11)—avg /sum 平均求和

1、环境准备 windows 7&#xff0c;8&#xff0c;10&#xff0c;11操作系统ahk 2.x_64位 2、使用方式 avg /sum 计算平均值&#xff0c;计算总和 支持数字中可以简写 k(千) &#xff0c; w(万) &#xff0c;y(亿) 可以计算运行框中的数据&#xff0c;也可以计算剪切板中的数…

【Linux】进程控制-进程终止

目录 一、进程终止&#xff0c;OS做了什么&#xff1f; 二、进程终止的常见方式 1、代码跑完&#xff0c;结果正确 2、代码跑完&#xff0c;结果不正确 补充 (1)、main函数的返回值的意义是什么&#xff1f; (2)、return 0的含义是什么&#xff1f; (3)、退出码是什么和…

ps-把文字刻进石头上

使用到的工具 准备图片&#xff1a;一张石头的图片&#xff0c;一张有喜欢字体的空白图片 得到一个纹理的psd文件&#xff1a;只把文字的图片显示&#xff0c;CTRLshifts保存成psd文件 “滤镜”——“滤镜库”——“纹理化”——&#xff08;选中文字图片的psd文件&#xff09…

代码随想录算法训练营第三十六天|01背包问题 二维 ,01背包问题 一维 ,416. 分割等和子集

背包理论基础 01 背包&#xff08;二维&#xff09; 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 背包最大重量为4。 物品为&#x…

Segment Anything--SAM自动标注(一)

文章目录 开场白基本组件搞事情从来不是一帆风顺复旦方案分支回归主线 开场白 老样子先说一下为什么我会看到这篇文章。答案是“自动标注”。 这个事情是这样&#xff0c;自动驾驶不光需要做目标检测任务也需要语义分割的信息给到后处理。当然现在做自动驾驶都在往BEV方案上靠…

IntelliJ IDEA 之初体验

文章目录 第一步&#xff1a;下载与安装 IntelliJ IDEA1&#xff09;官网下载2&#xff09;选择那种安装包3&#xff09;开始下载4&#xff09;解压 第二步&#xff1a;启动 IntelliJ IDEA第三步&#xff1a;创建第一个 Java 项目第四步&#xff1a;运行第一个 Java 程序1&…

【408】计算机学科专业基础 - 计算机组成原理

一、计算机系统概述 【复习提示】 本章是组成原理的概述&#xff0c;考查时易针对有关概念或性能指标出选择题&#xff0c;也可能综合后续章节的内容出有关性能分析的综合题。掌握本章的基本概念&#xff0c;是学好后续章节的基础。部分知识点在初学时理解不深刻也无须担忧&am…