思维导图
创建三个进程,一个子进程拷贝文件的前半部分, 一个子进程拷贝文件的后半部分
#include<head.h>
int main(int argc, const char *argv[])
{
if(argc !=4)
{
perror("error");
return -1;
}
int a=-1;
if((a=open(argv[1],O_RDONLY))==-1)
{
perror("open error");
return -1;
}
int b=-1;
if((b=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC))==-1)
{
perror("open error");
return -1;
}
int c=-1;
if((c=open(argv[3],O_WRONLY|O_CREAT|O_TRUNC))==-1)
{
perror("open error");
return -1;
}
//计算文件大小
int len=lseek(a,SEEK_SET,SEEK_END);
int d=0;
pid_t pid1=-1;
//创建一个子进程
pid1=fork();
if(pid1==0)
{ //子进程1读取文件前半部分
while(1)
{
char buf1;
read(a,&buf1,sizeof(buf1));
write(b,&buf1,sizeof(buf1));
d++;
if(d==len/2)
{
break;
}
}
}else if(pid1>0)
{
pid_t pid2=fork();
if(pid2==0)
{ //将光标移到文件中间
lseek(a,len/2,SEEK_SET);
//子进程2读取文件后半部分
while(1)
{
char buf2;
int res=read(a,&buf2,sizeof(buf2));
write(c,&buf2,sizeof(buf2));
if(res==0)
{
break;
}
}
}
else if(pid2>0)
{
printf("父进程回收资源\n");
wait(NULL);
wait(NULL);
}else
{
perror("fork error");
return -1;
}
}else
{
perror("fork error");
return -1;
}
close(a);
close(b);
close(c);
return 0;
}