思维导图
图
1> 创建出三个进程完成两个文件之间拷贝工作,子进程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 dstfile");
return -1;
}
//创建源文件和目标文件
FILE *src, *dst;
//以只读打开源文件
if((src=fopen(argv[1],"r"))==NULL)
{
perror("fopen srcfile error\n");
return -1;
}
//以追加的形式打开目标文件
if((dst=fopen(argv[2],"w"))==NULL)
{
perror("fopen dstfile error\n");
return -1;
}
//计算文件大小
fseek(src,0,SEEK_END);
long size=ftell(src);
//创建第一个子进程
pid_t pid1=-1;
pid1=fork();
//第一个子进程
if(pid1==0)
{
//拷贝后半段
sleep(1);
printf("后半段:\n");
fseek(src,size/2,SEEK_SET);
fseek(dst,0,SEEK_END);
char buf='\0';
while(ftell(dst)!=size)
{
fread(&buf,1,1,src);
fwrite(&buf,1,1,dst);
}
exit(EXIT_SUCCESS);
}
//父进程
else if(pid1>0)
{
//创建第二个子进程
pid_t pid2=fork();
//第二个子进程
if(pid2==0)
{
//拷贝前半段
printf("前半段:\n");
fseek(src,0,SEEK_SET);
fseek(dst,0,SEEK_SET);
long num2=0;
char buf='\0';
while(ftell(dst)!=(size/2))
{
int res=fread(&buf,1,1,src);
fwrite(&buf,1,1,dst);
}
exit(EXIT_SUCCESS);
}
//父进程回收资源
else if(pid2>0)
{
wait(NULL);
wait(NULL);
printf("父进程,回收资源\n");
}
else
{
perror("fork pid2 error\n");
return -1;
}
}
else
{
perror("fork pid1 error\n");
return -1;
}
//关闭文件
fclose(src);
fclose(dst);
return 0;
}