IO进程线程day4

发布于:2024-02-20 ⋅ 阅读:(42) ⋅ 点赞:(0)

1.思维导图

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

#include<myhead.h>

int main(int argc, const char *argv[])
{
	//判断终端输入的参数是否合法
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usage:./a,out srcfile destfile\n");
		return -1;
	}
	//定义文件指针,以只读的方式打开文件
	FILE *srcfp=NULL;
	srcfp=fopen(argv[1],"r");
	if(srcfp==NULL)
	{
		perror("fopen error");
		return -1;
	}
	//定义文件指针,以只写的方式打开
	FILE *destfp=NULL;
	destfp=fopen(argv[2],"w");
	if(destfp==NULL)
	{
		perror("fopen error");
		return -1;
	}
	//将光标定位在文件结束位置
	fseek(srcfp,0,SEEK_END);
	//返回值就是文件大小
	int size=ftell(srcfp);
	//把光标移动到文件开头
	fseek(srcfp,0,SEEK_SET);
	//定义父进程
	pid_t pid=-1;
	//使用父进程创建一个子进程
	pid=fork();
	//判断父子进程执行的程序代码
	if(pid>0)//判断是父进程
	{
		char buf;
		//光标移动到文件的一半
		fseek(srcfp,size/2,SEEK_SET);
		while(ftell(srcfp)!=size)//当文件读写到最后时结束
		{
			fread(&buf,1,1,srcfp);//读
			fwrite(&buf,1,1,srcfp);//写
		}
		//退出进程
		exit(EXIT_SUCCESS);
	}
	else if(pid==0)//子进程
	{
		//光标移动到文件开头
		fseek(destfp,0,SEEK_SET);
		char buf;
		while(ftell(destfp)<size)//读取到文件一半大小就结束
		{
			fread(&buf,1,1,destfp);//读
			fwrite(&buf,1,1,destfp);//写
		}
		//退出进程
		exit(EXIT_SUCCESS);
	}
	if(pid>0)
	{
		//回收进程
		wait(NULL);
		wait(NULL);
	}
	//关闭文件
	fclose(srcfp);
	fclose(destfp);
	return 0;
}

程序运行前:

程序运行后:


网站公告

今日签到

点亮在社区的每一天
去签到