使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程的资源
#include<myhead.h>
int main(int argc, const char *argv[])
{
//只读打开目标文件
//计算文件大小
//计算中值
//关闭文件
int fp=-1;
if((fp=open("./make.c",O_RDONLY))==-1)
{
perror("0 open error");
return -1;
}
int size=lseek(fp,0,SEEK_END);
int halfsize=size/2;
close(fp);
pid_t pid = -1;
//创建一个子进程
pid = fork();
//判断父子进程执行的程序代码
if(pid > 0)
{
//拷贝目标文件前半部分
int fp=-1;
if((fp=open("./make.c",O_RDONLY))==-1)
{
perror("1 open error");
return -1;
}
int fp1=-1;
if((fp1=open("./test.txt",O_WRONLY|O_CREAT,0664))==-1)
{
perror("2open error");
return -1;
}
int start=0;
lseek(fp,start,SEEK_SET);
char prehalf[128];
while(1)
{
int len=read(fp,prehalf,sizeof(prehalf));
if(len<=0)
{
break;
}
start+=len;
if(start>halfsize)
{
int over=start-halfsize;
write(fp1,prehalf,len-over);
break;
}
write(fp1,prehalf,len);
}
close(fp);
close(fp1);
printf("我是父进程,当前进程id号:%d,ppid=%d, childid=%d\n", getpid(),\
getppid(), pid);
}else
{
//拷贝目标文件后半部分
int fp=-1;
if((fp=open("./make.c",O_RDONLY))==-1)
{
perror("3 open error");
return -1;
}
int fp1=-1;
if((fp1=open("./test.txt",O_WRONLY|O_APPEND,0664))==-1)
{
perror("4 open error");
return -1;
}
int start=halfsize;
lseek(fp,start,SEEK_SET);
char lasthalf[128];
while(start<size)
{
int len=read(fp,lasthalf,sizeof(lasthalf));
if(len<=0)
{
break;
}
write(fp1,lasthalf,len);
start+=len;
}
close(fp);
close(fp1);
printf("我是子进程当前进程id号:%d,ppid = %d\n", getpid(), getppid());
exit(0);
}
wait(NULL);
return 0;
}
效果图
被拷贝文件
拷贝文件
思维导图