#include "my_head.h"
int main(int argc, const char *argv[])
{
//确保copy.png存在且处于清空状态
int fd_w=("/copy.png",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd_w<0)
{
perror("open");
return -1;
}
close(fd_w);
pid_t cpid=fork();
//父子进程在fork后打开文件,此时修改各自偏移量不会相互影响
//以读的方式打开源文件
int fd_r=open("/2.png",O_RDONLY);
if(fd_r<0)
{
perror("open");
return -1;
}
fd_w=open("/copy.png",O_WRONLY);
if(fd_w<0)
{
perror("open");
return -1;
}
//计算文件大小
struct stat buf;
if(stat("/2.png",&buf)<0)
{
perror("stat");
return -1;
}
if(cpid>0)
{
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
char c=0;
for(int i=0;i<buf.st_size/2;i++)
{
read(fd_r,&c,sizeof(c));
write(fd_w,&c,sizeof(c));
}
printf("前半部分拷贝完毕\n");
wait(NULL);
}
else if(0==cpid)
{
//子进程运行--->拷贝后半部分
lseek(fd_r,buf.st_size/2,SEEK_SET);
lseek(fd_w,buf.st_size/2,SEEK_SET);
char c = 0;
for(int i=buf.st_size/2;i<buf.st_size;i++)
{
read(fd_r,&c,sizeof(c));
write(fd_w,&c,sizeof(c));
}
printf("后半部分拷贝完毕\n");
}
else
{
perror("fork");
return -1;
}
//关闭两个文件
close(fd_r);
close(fd_w);
return 0;
}