IO进程线程 DAY4 作业

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

#include <head.h>
int main(int argc, const char *argv[])
{
	//判断文件是否为3个
	if(argc != 3)
	{
		printf("Input File Error\n");
		printf("usage:a.out srcfile dstfile\n");
		return -1;
	}
	int srcfp = -1;
	int dstfp = -1;
	//以只读形式打开源文件
	if((srcfp = open(argv[1],O_RDONLY)) == -1)
	{
		perror("open error");
		return -1;
	}
	//计算文件总字节数
	int length = lseek(srcfp,0,SEEK_END);
	//取中间值
	int mid = length/2;
	//关闭文件表示符
	close(srcfp);

	//定义一个容器放读取内容
	char buf[10]="";

	//定义一个变量放进程id1
	int pid1 = -1;
	
	//创建第一个子进程
	pid1 = fork();

	if(pid1 > 0)
	{
		//定义一个变量放进程id2
		int pid2 = -1;
		pid2 = fork();

		if(pid2 > 0)
		{
			printf("这是父进程,ppid = %d\n",getppid());	

			//回收子进程
			wait(NULL);
			wait(NULL);
			printf("父进程成功回收子进程\n");
		}else if(pid2 == 0)
		{
			printf("第二个子进程,pid2 = %d\n",getpid());
			//以只读形式打开源文件
			if((srcfp = open(argv[1],O_RDONLY)) == -1)
			{
				perror("open error");
				return -1;
			}
			//以写的形式打开目标文件
			if((dstfp = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664)) == -1)
			{
				perror("open error");
				return -1;
			}

			int ret1 = -1;
			//光标定位到中间
			lseek(srcfp,mid+1,SEEK_SET);
			lseek(dstfp,mid+1,SEEK_SET);
			while((ret1 = read(srcfp,buf,sizeof(buf))))
			{
				write(dstfp,buf,ret1);
			}	
			

			//退出子进程
			exit(EXIT_SUCCESS);
		}else
		{
			perror("fork error");
			return -1;
		}


	}else if(pid1 == 0)
	{	
		printf("第一个子进程,pid1 = %d\n",getpid());
	
		//以只读形式打开源文件
		if((srcfp = open(argv[1],O_RDONLY)) == -1)
		{
			perror("open error");
			return -1;
		}
		//以写的形式打开目标文件
		if((dstfp = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664)) == -1)
		{
			perror("open error");
			return -1;
		}
		lseek(srcfp,0,SEEK_SET);
		lseek(dstfp,0,SEEK_SET);

		int ret = -1;
		while(1)
		{
			ret = read(srcfp,buf,sizeof(buf));
			int count =0;
			count+=ret;
			if(count < mid)
			{
				write(dstfp,buf,ret);
			}
			else if(count >= mid)
			{
				write(dstfp,buf,ret-(count-mid));
				break;
			}
		
		}
		
		//退出子进程
		exit(EXIT_SUCCESS);
	}else
	{
		perror("fork error");
		return -1;
	}

	//关闭文件描述符
	close(srcfp);
	close(dstfp);
	printf("拷贝成功\n");
	return 0;
}

 

2.思维导图

 

 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值