多进程拷贝文件
#include<my_head.h>
//求取文件长度函数*************************************************************
int lenth(const char *read_file,const char *write_file)
{
//定义文件描述符,打开读写文件
int rfd = -1,wfd = -1;
if((rfd = open(read_file,O_RDONLY)) == -1)
{
perror("open rfd error");
return -1;
}
//先创建写入文件,后续子进程调用拷贝函数时无需再创建
if((wfd = open(write_file,O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)
{
perror("open wfd error");
return -1;
}
//计算读取文件的长度
int len = lseek(rfd,0,SEEK_END);
//关闭文件
close(rfd);
close(wfd);
return len;
}
//复制函数*****************************************************************
int copy(const char *read_file,const char *write_file,int start,int len)
{
//打开读写文件
int rfd = -1,wfd = -1;
if((rfd = open(read_file,O_RDONLY)) == -1)
{
perror("open rfd error");
return -1;
}
if((wfd = open(write_file,O_WRONLY)) == -1)
{
perror("open wfd error");
return -1;
}
//定义变量接收read返回值,用来控制每次写入数量
int res = 0;
//定义变量统计读取写入总量
int count = 0;
char buf [128]= "";
//读写光标都偏移到指定位置
lseek(rfd,start,SEEK_SET);
lseek(wfd,start,SEEK_SET);
//循环读写
while((res = read(rfd,buf,sizeof(buf))) != 0)
{
//统计读取长度
count += res;
//判断是否读取超出长度,如果超出只能写入未超出的部分
if(count >= len)
{
write(wfd,buf,res-(count-len));
break;
}
write(wfd,buf,res);
}
//关闭文件
close(rfd);
close(wfd);
return 0;
}
/*********************************** 主函数 ************************************/
int main(int argc, const char *argv[])
{
//判断外部传参
if(argc != 3)
{
printf("input error\n");
printf("usage ./a.out filename1 filename2\n");
return -1;
}
//调用函数计算长度,并创建写入文件
int len = lenth(argv[1],argv[2]);
//父进程创建第一个子进程
int pid1 = fork();
//第一个子进程读取写入前半部分
if(pid1 == 0)
{
copy(argv[1],argv[2],0,len/2);
//退出子进程
exit(EXIT_SUCCESS);
}
else if(pid1 > 0)
{
//父进程创建第二个子进程
int pid2 = fork();
if(pid2 == 0)
{
//第二个子进程读取写入后半部分
copy(argv[1],argv[2],len/2,len-len/2);
//退出子进程
exit(EXIT_SUCCESS);
}
//父进程阻塞回收子进程资源
else if(pid2 > 0)
{
printf("copy success\n");
wait(NULL);
wait(NULL);
}
else
{
perror("fork error");
return -1;
}
}
else
{
perror("fork error");
return -1;
}
return 0;
}