嵌入式学习-IO进程线程-Day4

发布时间:2024年01月05日

Day4

思维导图

在这里插入图片描述

作业

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

#include <myhead.h>
int main(int argc, const char *argv[])
{
	if(argc!=3)
	{
		puts("终端输入格式不合理");
		return -1;
	}

	//先定义文件标识符
	int src=0;
	int dest=0;

	pid_t pid=-1;
	pid = fork();

	//定义一个字符搬运工
	char buf[20]="";
	if((src=open(argv[1],O_RDONLY))==-1)
	{
		perror("打开源文件错误");
		return -1;
	}

	off_t size_src=lseek(src,0,SEEK_END);     //确定文件大小
	lseek(src,0,SEEK_SET);    //回到开头
	off_t half_size=size_src/2;     //确定中间位置



	if(pid == 0)
	{
		if((dest=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
		{
			perror("打开目标文件错误");
			return -1;
		}

		off_t count=0;  //定义一个计数器来判断是否到中间
		while(count<half_size)
		{
			int res =read(src,buf,sizeof(buf));
			write(dest,buf,res);
			count+=res;
		}
		//先关闭文件
		close(src);
		close(dest);

		//
	}

	else if(pid>0)
	{

		pid_t pid2 = fork();
		if(pid2>0)
		{

			wait(NULL);
		}else if(pid2 == 0)
		{	

			if((src=open(argv[1],O_RDONLY))==-1)
			{
				perror("打开源文件错误");
				return -1;
			}

			if((dest=open(argv[2],O_WRONLY,0664))==-1)
			{
				perror("打开目标文件错误");
				return -1;
			}

			//将文件定位到中间位置
			lseek(src,half_size,SEEK_SET);


			while (1) 
			{
				int res = read(src, buf, sizeof(buf));

				if (res > 0) {
					write(dest, buf, res);
					//count += res;//用于追踪整个循环过程中成功读取的总字节数
				} else if (res == 0) {
					//判断是否到达文件末尾
					break;
				} else {
					//读取文件错误
					perror("读取文件错误");
					break;
				}
			}


			close(src);
			close(dest);

			exit(EXIT_SUCCESS);
		}else
		{
			perror("");
			return -1;
		}

		wait(NULL);

		exit(EXIT_SUCCESS);
		wait(NULL);
	}
	else
	{
		perror("");
		return -1;
	}


	wait(NULL);
	wait(NULL);

	printf("父进程退出\n");
	return 0;
}

这段代码只能复制一半

运行结果

在这里插入图片描述

在这里插入图片描述

文章来源:https://blog.csdn.net/m0_56018621/article/details/135398209
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。