使用两个子进程进行文件拷贝,父进程进行资源回收
#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);}//关闭文件描述,以及子进程1close(fd);close(cfd);exit(EXIT_SUCCESS);}else if(pid>0){//创建一个新的子进程2int 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和子进程2wait(NULL);wait(NULL);}else{perror("fork error");return -1;}printf("拷贝完成\n");}return 0;
}