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 inputfile outfile\n");
return -1;
}
int srcfd=-1,dstfd=-1,fd=-1;
char buf[10]="";
//计算文件中间的位置
if((fd=open(argv[1],O_RDONLY))==-1)
{
perror("open file error");
return -1;
}
int pos=lseek(srcfd,0,SEEK_END)/2;
//创建第一个子进程
pid_t pid1=-1;
pid1=fork();
if(pid1 == 0)
{
printf("我是老大,我来拷贝上半部分\n");
//打开源文件
if((srcfd=open(argv[1],O_RDONLY))==-1)
{
perror("1 open srcfile error");
return -1;
}
//打开目标文件
if((dstfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("1 open dstfile error");
return -1;
}
//拷贝
int count=0;
while(1)
{
memset(buf,0,sizeof(buf));
int res=read(srcfd,buf,sizeof(buf));
write(dstfd,buf,res);
count+=res;
if(count>=pos)
{
break;
}
}
//关闭
close(srcfd);close(dstfd);
printf("上半部分拷贝完成\n");
exit(EXIT_SUCCESS);
}else if(pid1 > 0)
{
//创建第二个子进程
pid_t pid2=fork();
if(pid2 == 0)
{
printf("我是老二,我来拷贝下半部分\n");
//打开源文件
if((srcfd=open(argv[1],O_RDONLY))==-1)
{
perror("2 open srcfile error");
return -1;
}
//打开目标文件
if((dstfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("2 open dstfile error");
return -1;
}
//偏移光标
lseek(srcfd,pos,SEEK_SET);
//拷贝
while(1)
{
memset(buf,0,sizeof(buf));
int res=read(srcfd,buf,sizeof(buf));
write(dstfd,buf,res);
if(res==0)
break;
}
//关闭
close(srcfd);close(dstfd);
printf("下半部分拷贝完成\n");
sleep(3);
exit(EXIT_SUCCESS);
}else if(pid2 > 0)
{
printf("我是父进程\n");
sleep(5);
wait(NULL);
printf("回收一个子进程\n");
wait(NULL);
printf("回收一个子进程\n");
}else
{
perror("fork2 error");
return -1;
}
}else
{
perror("fork1 error");
return -1;
}
return 0;
}