IO day4

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

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//打开文件
	FILE *fp;
	FILE *fp1;
	if((fp=fopen("./ddd.txt","r"))==NULL){
		perror("fopen error");
		return -1;
	}
	if((fp1=fopen("./eee.txt","w"))==NULL){
		perror("fopen error");
		return -1;
	}
	//创建进程
	pid_t pid;
	pid=fork();
	//求出拷贝文件的长度,并将位置指针指向头
	int flen=lseek(fp->_fileno,0,SEEK_END);     //用的文件IO求大小
	fseek(fp,0,SEEK_SET);     //用标准IO光标指向首地址
	//进入父进程
	if(pid<0){
		perror("cpy error");
		return -1;
	}
	else if(pid>0){
		printf("开始拷贝前一半\n");
		//开始拷贝
		char buf;
		int ret;
		//循环,一个一个字符拷贝文件
		while((ftell(fp))<=flen/2){
			if((ret=fread(&buf,1,1,fp))==0){
				break;
			}
			fwrite(&buf,1,1,fp1);
			//因为是标准IO,所以一定要刷新,才能将拷贝的内容从缓存区提取出来
			//!!!!!!!
			fflush(fp1);
		}
		//等待子进程结束再回收
		wait(NULL);
	}
	//进入子进程
	else{
		printf("开始拷贝后一半\n");
		char buf;
		int ret;
		//将读和写的光标都指向前一半的最后,开始拷贝后半段
		fseek(fp,flen/2+1,SEEK_SET);
		fseek(fp1,0,SEEK_END);
		//循环还是老样子,到文件结束而结束
		while((ftell(fp))>=flen/2&&(ftell(fp))<flen){
			if((ret=fread(&buf,1,1,fp))==0){
				break;
			}
			fwrite(&buf,1,ret,fp1); 
		}
	}
	//关闭文件
	fclose(fp);
	fclose(fp1);
	return 0;
}

 实现效果:

 

 

2.使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源 

#include <myhead.h>

int main(int argc, const char *argv[])
{

	if(argc!=3){
		perror("error");
		return -1;
	}
	//创建一个读文件描述符
	int fp= open(argv[1], O_RDONLY);
	if(fp < 0)
	{
		perror("open");
		return -1;
	}

	//创建一个写文件描述符
	int fp1 = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0664);
	if(fp1< 0)
	{
		perror("open");
		return -1;
	}

	off_t file_size = lseek(fp, 0, SEEK_END);
	printf("文件的大小是%ld字节\n", file_size);

	pid_t pid=fork();
	if(pid<0){
		perror("cpy error");
		return -1;
	}
	else if(pid>0){
		wait(NULL);
		pid_t pid1=fork();
		if(pid1<0){
			perror("cpy error");
			return -1;
		}
		else if(pid1>0){
			printf("开始拷贝前1/3\n");
			lseek(fp,0,SEEK_SET);
			lseek(fp1,0,SEEK_SET);
			char buf;
			for(int i=0;i<=file_size/3;i++){
				if((read(fp,&buf,1))<0){
					perror("read error");
					return -1;
				}
				if(write(fp1,&buf,1)<0){
					perror("write error");
					return -1;
				}
			}
			wait(NULL);
		}
		else{
			printf("开始拷贝中间1/3\n");
			lseek(fp,file_size/3,SEEK_SET);
			lseek(fp1,file_size/3,SEEK_SET);
			char buf;
			for(int i=(file_size/3);i<(file_size/3*2);i++){
				if((read(fp,&buf,1))<0){
					perror("read error");
					return -1;
				}
				if(write(fp1,&buf,1)<0){
					perror("write error");
					return -1;
				}
			}
		}
	}
	else{
		printf("开始拷贝最后1/3\n");
		lseek(fp,file_size/3*2,SEEK_SET);
		lseek(fp1,file_size/3*2,SEEK_SET);
		char buf;
		for(int i=(file_size/3*2);i<(file_size);i++){
			if((read(fp,&buf,1))<0){
				perror("read error");
				return -1;
			}
			if(write(fp1,&buf,1)<0){
				perror("write error");
				return -1;
			}
		}
	}
	close(fp);
	close(fp1);

	return 0;
}

实现效果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值