思维导图
创建出三个进程完成两个文件之间拷贝工作,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程回收子进程的资源
#include <my_head.h>
int main(int argc, const char *argv[])
{
//判断外部传参个数
if(argc!=3)
{
printf("input file error");
return -1;
}
//定义两个文件描述符
int srcfd=-1;
int destfd=-1;
//分别以可读和可写的方式打开源文件和目标文件
if((srcfd=open(argv[1],O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
if((destfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open destfile error");
return -1;
}
//计算源文件的大小
unsigned int size;
size=lseek(srcfd,0,SEEK_END);
unsigned int halfsize=size/2;
//定义一个搬运工
char buf[10]="";
int count=0;
pid_t pid=-1;
//创建一个子进程
pid_t pid1=fork();
if(pid1==0)
{
//子进程1拷贝前半部分
lseek(srcfd,0,SEEK_SET);//把光标放在开头
lseek(destfd,0,SEEK_SET);
while(1)
{
int res=read(srcfd,buf,sizeof(buf));
count+=res;
if(count>=res)
{
write(destfd,buf,res-(count-halfsize));
break;
}
write(destfd,buf,res);
}
exit(EXIT_SUCCESS);
}
else if(pid1>0)
{
//创建子进程2
pid_t pid2=fork();
if(pid2==0)
{
//将光标移动到一半的位置
lseek(srcfd,halfsize,SEEK_SET);
lseek(destfd,halfsize,SEEK_SET);
//子进程2拷贝后半部分
while(1)
{
int res=read(srcfd,buf,sizeof(buf));
count+=res;
if(count>=res)
{
write(destfd,buf,res-(count-halfsize));
break;
}
write(destfd,buf,res);
}
exit(EXIT_SUCCESS);
}
else if(pid2>0)
{
//父进程回收资源
wait(NULL);
wait(NULL);
}
else
{
perror("fork error");
return -1;
}
}
else
{
perror("fork error");
return -1;
}
//关闭文件
close(srcfd);
close(destfd);
return 0;
}