思维导图
创建出三个进程完成两个文件的拷贝工作,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程回收子进程的资源
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<header.h>
//求源文件大小
int get_file_len(const char *srcfile,const char *dstfile)
{
int srcfd,dstfd;
//以只读的形式打开源文件
if((srcfd=open(srcfile,O_RDONLY))==-1)
{
perror("srcfile open error");
return -1;
}
//以创建清空的形式打开目标文件
if((dstfd=open(dstfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("dstfile open error");
return -1;
}
//求源文件大小
int len=lseek(srcfd,0,SEEK_END);
//关闭文件后返回
close(srcfd);
close(dstfd);
return len;
}
//定义拷贝函数
int copy_file(const char *srcfile,const char *dstfile,int start,int len)
{
int srcfd,dstfd;
//以只读的形式打开源文件
if((srcfd=open(srcfile,O_RDONLY))==-1)
{
perror("srcfile open error");
return -1;
}
//以只写的形式打开目标文件
if((dstfd=open(dstfile,O_WRONLY,0664))==-1)
{
perror("dstfile open error");
return -1;
}
//将两个文件定位到start处
lseek(srcfd,start,SEEK_SET);
lseek(dstfd,start,SEEK_SET);
//拷贝文件
char buf[128]="";
int res=0;//每次成功读取的字符个数
int sum=0;//记录读取字符的总个数
while(1)
{
res=read(srcfd,buf,sizeof(buf));//读取文件内容
sum+=res;//将读取的字符个数累加
if(sum>=len||res==0)
{
write(dstfd,buf,res-(sum-len));
break;
}
write(dstfd,buf,res);//拷贝到目标文件中
}
//关闭两个文件
close(srcfd);
close(dstfd);
}
int main(int argc, const char *argv[])
{
if(argc!=3)
{
printf("input file error\n");
printf("usage:./a.out srcfile dstfile\n");
return -1;
}
pid_t pid1=-1;//定义进程号变量
//求源文件大小
int len=get_file_len(argv[1],argv[2]);
pid1=fork();//创建子进程
if(pid1==0)
{
//子进程1
//执行拷贝内容
copy_file(argv[1],argv[2],0,len/2);
//退出进程
exit(EXIT_SUCCESS);
}
else if(pid1>0)
{
//父进程
//创建子进程2
pid_t pid2=-1;
pid2=fork();
if(pid2==0)
{
//子进程2
copy_file(argv[1],argv[2],len/2,len-len/2);
//退出进程
exit(EXIT_SUCCESS);
}
else if(pid2>0)
{
//父进程
wait(NULL);
wait(NULL);
}
else
{
perror("fork error");
return -1;
}
}
else
{
perror("fork error");
return -1;
}
puts("拷贝成功");
return 0;
}