902作业

cs 复制代码
#include<myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid = -1;
	int fd1 = -1;
	int fd2 = -1;
	int num=0;
	ssize_t s;
	if (argc!=3)
	{
		printf("输入格式错误\n");
		return -1;
	}
	pid = fork();
	if ((fd1 = open(argv[1],O_RDONLY))==-1)
	{
		printf("源文件打开失败\n");
		return -1;
	}
	printf("源文件打开成功\n");

	off_t len = lseek(fd1,0,SEEK_END);

	lseek(fd1,0,SEEK_SET);

	close(fd1);
	if (pid>0)
	{
		printf("父进程:%d,拷贝前一半的内容\n",getpid());
		if ((fd1 = open(argv[1],O_RDONLY))==-1)
		{
			printf("源文件打开失败\n");
			return -1;
		}
		printf("源文件打开成功\n");

		if ((fd2 = open(argv[2],O_RDWR|O_CREAT|O_TRUNC))==-1)
		{
			printf("目标文件打开失败\n");
			return -1;

		}
		printf("目标文件打开成功\n");

		char str[128]="";
		while (num<(len/2)&&(s=read(fd1,str,sizeof(str)>(len/2-num)?(len/2-num):sizeof(str)))!=0)
		{
			write(fd2,str,s);
			num=s+num;
			bzero(str,sizeof(str));
			
		}
		
		close(fd1);
		close(fd2);

		wait(NULL);
		printf("已经成功回收\n");
	}
	else if (pid==0)
	{
		num=0;
		printf("子进程:%d,拷贝后一半的内容\n",getpid());
		if ((fd1 = open(argv[1],O_RDONLY))==-1)
		{
			printf("源文件打开失败\n");
			return -1;
		}
		printf("源文件打开成功\n");

		if ((fd2 = open(argv[2],O_WRONLY|O_CREAT|O_APPEND))==-1)
		{
			printf("目标文件打开失败\n");
			return -1;

		}
		printf("目标文件打开成功\n");

		lseek(fd1,len/2,SEEK_SET);
		lseek(fd2,len/2,SEEK_SET);

		char str[128]="";

		while (num<(len-(len/2))&&(s=read(fd1,str,sizeof(str)>(len/2-num)?(len/2-num):sizeof(str)))!=0)
		{
			write(fd2,str,s);
			num=s+num;
			bzero(str,sizeof(str));
		}
		
		printf("子进程已拷贝\n");
		close(fd1);
		close(fd2);
		exit(EXIT_SUCCESS);
	}

	return 0;
}
cs 复制代码
#include<myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid1 = -1;
	int fd1 = -1;
	int fd2 = -1;
	int num=0;
	ssize_t s;
	if (argc!=3)
	{
		printf("输入格式错误\n");
		return -1;
	}
	pid1 = fork();
	if ((fd1 = open(argv[1],O_RDONLY))==-1)
	{
		printf("源文件打开失败\n");
		return -1;
	}
	printf("源文件打开成功\n");

	off_t len = lseek(fd1,0,SEEK_END);

	lseek(fd1,0,SEEK_SET);

	close(fd1);
	if (pid1>0)
	{
		pid_t pid2 = fork();
		if (pid2>0)
		{
			printf("等待两个子进程的完成\n");	
			waitpid(pid1,NULL,0);
			waitpid(pid2,NULL,0);
			printf("已经成功回收\n");

		}
		else if(pid2==0)
		{
			printf("pid2子进程:%d,拷贝前一半的内容\n",getpid());
			if ((fd1 = open(argv[1],O_RDONLY))==-1)
			{
				printf("源文件打开失败\n");
				return -1;
			}
			printf("源文件打开成功\n");

			if ((fd2 = open(argv[2],O_RDWR|O_CREAT|O_TRUNC))==-1)
			{
				printf("目标文件打开失败\n");
				return -1;

			}
			printf("目标文件打开成功\n");

			char str[128]="";
			while (num<(len/2)&&(s=read(fd1,str,sizeof(str)>(len/2-num)?(len/2-num):sizeof(str)))!=0)
			{
				write(fd2,str,s);
				num=s+num;
				bzero(str,sizeof(str));

			}

			close(fd1);
			close(fd2);
			exit(EXIT_SUCCESS);
		}
	}
	else if (pid1==0)
	{
		num=0;
		printf("子进程:%d,拷贝后一半的内容\n",getpid());
		if ((fd1 = open(argv[1],O_RDONLY))==-1)
		{
			printf("源文件打开失败\n");
			return -1;
		}
		printf("源文件打开成功\n");

		if ((fd2 = open(argv[2],O_WRONLY|O_CREAT|O_APPEND))==-1)
		{
			printf("目标文件打开失败\n");
			return -1;

		}
		printf("目标文件打开成功\n");

		lseek(fd1,len/2,SEEK_SET);
		lseek(fd2,len/2,SEEK_SET);

		char str[128]="";

		while (num<(len-(len/2))&&(s=read(fd1,str,sizeof(str)>(len/2-num)?(len/2-num):sizeof(str)))!=0)
		{
			write(fd2,str,s);
			num=s+num;
			bzero(str,sizeof(str));
		}

		printf("子进程已拷贝\n");
		close(fd1);
		close(fd2);
		exit(EXIT_SUCCESS);
	}

	return 0;
}
相关推荐
草履虫建模14 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq16 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq16 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq17 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)18 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi18 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
不能隔夜的咖喱18 小时前
牛客网刷题(2)
java·开发语言·算法
VT.馒头18 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头19 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
咖丨喱20 小时前
IP校验和算法解析与实现
网络·tcp/ip·算法