使用两个子进程进行文件拷贝,父进程进行资源回收
#include <myhead.h>
int main(int argc, const char *argv[])
{
//创建一个文件描述符并以只读的方式打开
int fd=-1;
if((fd=open("./test.bmp",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
//使用lseek计算数据大小,确定数据的中心位置
int len=(lseek(fd,0,SEEK_END))/2;
close(fd);
int pid=-1;
int res;//将读取到的数据存入res中
int sum=0;//计算已经读取了多少
char buf[128]="";//定义一个存放数据的容器
//创建一个子进程1,拷贝一半文件
pid=fork();
if(pid==0)
{
//子进程
//以只读的方式打开源文件,再以只写的方式打开目标文件
int fd=-1;
int cfd=-1;
if((fd=open("./test.bmp",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
if((cfd=open("./aa.bmp",O_WRONLY|O_CREAT,0664))==-1)
{
perror("open error");
return -1;
}
//将光标定位到相同位置
lseek(fd,0,SEEK_SET);
lseek(cfd,0,SEEK_SET);
//循环将读取到的数据写入目标文件内
while((res=read(fd,buf,sizeof(buf)))!=0)
{
//计算已经读取了多少,如果读取到的数据等于或超过一半则退出循环
sum+=res;
if(sum>=len)
{
write(cfd,buf,res-(sum-len));
break;
}
write(cfd,buf,res);
}
//关闭文件描述,以及子进程1
close(fd);
close(cfd);
exit(EXIT_SUCCESS);
}else if(pid>0)
{
//创建一个新的子进程2
int pid2=-1;
pid2=fork();
if(pid2==0)
{
//子进程2
//重复子进程1的操作
int fd=-1;
int cfd=-1;
if((fd=open("./test.bmp",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
if((cfd=open("./aa.bmp",O_WRONLY|O_CREAT,0664))==-1)
{
perror("open error");
return -1;
}
//将两个文件的光标定位到中间-1的位置
lseek(fd,len-1,SEEK_SET);
lseek(cfd,len-1,SEEK_SET);
while((res=read(fd,buf,sizeof(buf)))!=0)
{
write(cfd,buf,res);
}
close(fd);
close(cfd);
exit(EXIT_SUCCESS);
}else if(pid2>0)
{
//父进程
//阻塞回收子进程1和子进程2
wait(NULL);
wait(NULL);
}else
{
perror("fork error");
return -1;
}
printf("拷贝完成\n");
}
return 0;
}