作业--day25

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc, const char *argv[])
{
	
	FILE *fp = NULL;
	FILE *cp_fp = NULL;

	//以只读方式打开a.c文件
	fp = fopen("./a.c", "r");
	if(fp == NULL){
		perror("fopen r ./a.c");
		return -1;
	}

	//获取文件大小,将文件大小除以2,以便分开复制
	fseek(fp, 0, SEEK_END);
	long size = ftell(fp);
	size = size / 2;
	fseek(fp, 0, SEEK_SET);

	//以只写方式打开cp_a.c文件
	cp_fp = fopen("./cp_a.c", "w");
	if(cp_fp == NULL){
		perror("fopen a ./cp_a.c");
		return -1;
	}

	//为避免光标共享的影响,重复打开两文件
	FILE *fp2 = NULL;
	FILE *cp_fp2 = NULL;

	//以只读方式打开a.c文件
	fp2 = fopen("./a.c", "r");
	if(fp2 == NULL){
		perror("fopen r ./a.c");
		return -1;
	}

	//以只写方式打开cp_a.c文件
	cp_fp2 = fopen("./cp_a.c", "w");
	if(cp_fp2 == NULL){
		perror("fopen a ./cp_a.c");
		return -1;
	}


	//第一个子进程
	int pid1 = -1;
	pid1 = fork();

	if(pid1 > 0){

		//第二个子进程
		int pid2 = -1;
		pid2 = fork();

		if(pid2 > 0){
			
			//回收两个子进程
			wait(NULL);
			wait(NULL);
			printf("回收完成\n");
			
			//关闭文件
			fclose(fp);
			fclose(cp_fp);
			fclose(fp2);
			fclose(cp_fp2);


		}else if(pid2 == 0){
			puts("第二子进程正在写入");

			//第二子进程将两个文件光标定位到开始位置,读取a.c中一半数据写入到cp_a.c
			fseek(cp_fp, 0, SEEK_SET);
			fseek(fp, 0, SEEK_SET);
			char buf[size];
			int res = fread(buf, 1, sizeof(buf), fp);
			fwrite(buf, 1, res, cp_fp);
			

			puts("第二子进程写完收工");
		}else{
			perror("fork pid2 error");
			return -1;
		}
	}else if(pid1 == 0){
		puts("第一子进程正在写入");

		//第一子进程将剩下一半数据进行复制
		char buf[10];
		int res = 0;
		fseek(cp_fp2, size, SEEK_SET);
		fseek(fp2, size, SEEK_SET);
		while((res = fread(buf, 1, sizeof(buf), fp2)) > 0){
			fwrite(buf, 1, res, cp_fp2);
		}

		puts("第一子进程写完收工");
	}else{

		perror("fork pid1 error");
		return -1;

	}

	return 0;
}

作业--day25_第1张图片

文件IO和标准IO的区别

答:文件IO和标准IO都是用于对文件进行数据读写的,标准IO相比于文件IO,使用了缓冲区,会先将数据输入到缓冲区中,等待缓冲区刷新,再进行系统调用。标准IO是对内核提供的函数进行二次封装,以提高效率。即标准IO是文件IO加上缓冲区。

文件描述符及其相关内容

答:文件描述符是用于对文件进行操作的整型变量,用于进行系统调用;一个进程中文件描述符是有限的,默认1024个;文件描述符遵循最小未分配原则;当进程启动后默认打开三个文件描述符,其中0为终端输入,1为终端输出,2为终端错误。

进程及其相关内容

答:进程是正在运行的程序,其是有生命周期的,是动态的;进程是计算机资源分配的最小单位;当进程启动时,系统会给进程分配4G的虚拟内存,其中3G用户空间是独立的,3~4G的内核空间是共享的;多个进程运行时,是通过时间片轮询,上下文切换进行调度的;进程状态包含创建态、就绪态、运行态、休眠态、死亡态。

思维导图

你可能感兴趣的:(c语言)