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

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;
}

这段代码只能复制一半

运行结果

在这里插入图片描述

在这里插入图片描述

  • 30
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值