1> 使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源
2> 使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
1:
#include <myhead.h>
int main(int argc, const char *argv[])
{
FILE *fp_y;
if((fp_y=fopen("./aa.txt","r")) == NULL)
{
perror("open error");
return -1;
}
FILE *fp_c;
if((fp_c=fopen("./bb.txt","w")) == NULL)
{
perror("open error");
return -1;
}
fseek(fp_y,0,SEEK_END);
int size = ftell(fp_y);
char buf[1];
pid_t pid;
pid = fork();
if(pid < 0)
{
perror("fork error");
return -1;
}
else if(pid > 0)//父进程
{
fseek(fp_y,0,SEEK_SET);
while(ftell(fp_y) != (size/2))
{
//置空数组
memset(buf, 0, sizeof(buf));
//读取文件1的内容
fread(buf, sizeof(buf),1, fp_y);
//向文件2中写入数据
fwrite(buf, sizeof(buf),1, fp_c);
//判断源文件访问是否出错
if(ferror(fp_c))
{
printf("读取失败\n");
break;
}
}
printf("拷贝上半部分成功\n");
fclose(fp_y);
fclose(fp_c);
wait(NULL);
}
else if(pid == 0)//子进程
{
fseek(fp_y,-(size/2),SEEK_END);
while(1)
{
//置空数组
memset(buf, 0, sizeof(buf));
//读取文件1的内容
fread(buf, sizeof(buf),1, fp_y);
//向文件2中写入数据
fwrite(buf, sizeof(buf),1, fp_c);
//判断源文件是否读取完毕
if(feof(fp_y))
{
printf("已读取完毕\n");
break;
}
}
printf("拷贝下半部分成功\n");
fclose(fp_y);
fclose(fp_c);
exit(EXIT_SUCCESS);
}
return 0;
}
结果:
2:
#include <myhead.h>
int main(int argc, const char *argv[])
{
FILE *fp_y;
if((fp_y=fopen("./aa.txt","r")) == NULL)
{
perror("open error");
return -1;
}
FILE *fp_c;
if((fp_c=fopen("./cc.txt","w")) == NULL)
{
perror("open error");
return -1;
}
fseek(fp_y,0,SEEK_END);
int size = ftell(fp_y);
char buf[1];
pid_t pid1;
pid1 = fork();
if(pid1 < 0)
{
perror("fork error");
return -1;
}
else if(pid1 > 0)//父进程
{
pid_t pid2;
pid2=fork();
if(pid2<0)
{
perror("fork error");
return -1;
}
else if(pid2>0)
{
fseek(fp_y,0,SEEK_SET);
while(ftell(fp_y) != (size/3))
{
//置空数组
memset(buf, 0, sizeof(buf));
//读取文件1的内容
fread(buf, sizeof(buf),1, fp_y);
//向文件2中写入数据
fwrite(buf, sizeof(buf),1, fp_c);
//判断源文件访问是否出错
if(feof(fp_y))
{
printf("已读取完毕\n");
break;
}
}
printf("拷贝前三分之一部分成功\n");
fclose(fp_y);
fclose(fp_c);
wait(NULL);
wait(NULL);
}
else
{
sleep(4);
fseek(fp_y,(size/3),SEEK_SET);
while(ftell(fp_y)!=((size/3)*2))
{
//置空数组
memset(buf, 0, sizeof(buf));
//读取文件1的内容
fread(buf, sizeof(buf),1, fp_y);
//向文件2中写入数据
fwrite(buf, sizeof(buf),1, fp_c);
//判断源文件访问是否出错
if(feof(fp_y))
{
printf("已读取完毕\n");
break;
}
}
printf("拷贝中间三分之一部分成功\n");
fclose(fp_y);
fclose(fp_c);
exit(EXIT_SUCCESS);
}
}
else if(pid1 == 0)//子进程1
{
sleep(7);
fseek(fp_y,((size/3)*2),SEEK_SET);
while(1)
{
//置空数组
memset(buf, 0, sizeof(buf));
//读取文件1的内容
fread(buf, sizeof(buf),1, fp_y);
//向文件2中写入数据
fwrite(buf, sizeof(buf),1, fp_c);
//判断源文件是否读取完毕
if(feof(fp_y))
{
printf("已读取完毕\n");
break;
}
}
printf("拷贝后三分之一部分成功\n");
fclose(fp_y);
fclose(fp_c);
exit(EXIT_SUCCESS);
}
return 0;
}
结果:
思维导图:https://mubu.com/app/edit/home/7EbNyHx59VD#m