1、使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程的资源
#include<myhead.h>
int get_file_len(const char *srcfile,const char *destfile);
int copy_file(const char *srcfile,const char *destfile,int start,int len);
/*
* function: 主程序
* @param [ in]
* @param [out]
* @return
*/
int main(int argc, const char *argv[])
{
//判断外部传参
if(argc != 3)
{
printf("input file error\n");
printf("usage:./a.out srcfile destfile\n");
return -1;
}
//定义变量获取源文件的长度
int len=get_file_len(argv[1],argv[2]);
//创建多进程
pid_t pid=fork();
if(pid > 0)
{
puts("父");
copy_file(argv[1],argv[2],0,len/2); //父进程拷贝前一半
//阻塞等待子进程结束
wait(NULL);
}
else if(pid == 0)
{
puts("子");
copy_file(argv[1],argv[2],len/2,len-len/2); //子进程拷贝后一半
//退出进程
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
puts("拷贝成功");
return 0;
}
//定义变量获取源文件的长度
int get_file_len(const char *srcfile,const char *destfile)
{
int srcfd,destfd;
if((srcfd = open(srcfile,O_RDONLY)) == -1)
{
perror("open srcfile error");
return -1;
}
if((destfd = open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)
{
perror("open destfile error");
return -1;
}
//求源文件大小
int len=lseek(srcfd,0,SEEK_END);
close(srcfd);
close(destfd);
return len;
}
int copy_file(const char *srcfile,const char *destfile,int start,int len)
{
//以只读形式打开源文件,以只写的形式打开目标文件
int srcfd,destfd;
if((srcfd = open(srcfile,O_RDONLY)) == -1)
{
perror("open srcfile error");
return -1;
}
if((destfd = open(destfile,O_WRONLY)) == -1)
{
perror("open destfile error");
return -1;
}
//移动文件光标
lseek(srcfd,start,SEEK_SET);
lseek(destfd,start,SEEK_SET);
//拷贝工作
char buf[128]="";
int sum=0;
while(1)
{
//读取数据
int res = read(srcfd,buf,sizeof(buf));
sum+=res;
if( sum>=len || res == 0)
{
write(destfd,buf,res-(sum-len));
break;
}
//写入目标文件
write(destfd,buf,res);
}
//关闭文件
close(srcfd);
close(destfd);
return 0;
}