实现过程:
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
//打开仅读文件
int pn1=open("./1.png",O_RDONLY);
if(pn1<0)
{
perror("open");
return -1;
}
//打开仅写文件
int pn2=open("./2.png",O_WRONLY|O_CREAT|O_TRUNC,0777);
if(pn2<0)
{
perror("open");
return -1;
}
//求出文件的大小
off_t res = lseek(pn1, 0, SEEK_END);
//判断文件大小的奇偶性
int flag=(res%2==0?0:1);
//定义一个数组接收读取的内容
char str[100]="";
//定义一个数判断每次拷贝后还剩多少内容没有拷贝
int size;
//打开一个子进程
pid_t pid=fork();
//判断ID下面代码给父进程执行
if(pid>0)
{
//先让子进程执行完毕
sleep(2);
//父进程需要拷贝的数量
size=res/2;
//将两个文件的偏移量回到开头
lseek(pn1,0,SEEK_SET);
lseek(pn2,0,SEEK_SET);
//循环读取内容拷贝
while(1)
{
if(read(pn1,str,sizeof(str))<0)
{
perror("read");
return -1;
}
//如果剩余量大于数组容量,则直接拷贝,负责只需拷贝还剩下的数量即可
if(size>sizeof(str))
{
if(write(pn2,str,sizeof(str))<0)
{
perror("write");
return -1;
}
//减去每次拷贝的数量
size=size-sizeof(str);
}
else
{
if(write(pn2,str,size)<0)
{
perror("write");
return -1;
}
//当剩余量小于数组容量的时候,代表需要拷贝的数量已经完成
break;
}
}
printf("前半部分拷贝成功\n");
}
//子进程执行代码
if(0==pid)
{
size=(res/2)+flag;
lseek(pn1,res/2,SEEK_SET);
lseek(pn2,res/2,SEEK_SET);
while(1)
{
if(read(pn1,str,sizeof(str))<0)
{
perror("read");
return -1;
}
if(size>sizeof(str))
{
if(write(pn2,str,sizeof(str))<0)
{
perror("write");
return -1;
}
size=size-sizeof(str);
}
else
{
if(write(pn2,str,size)<0)
{
perror("write");
return -1;
}
break;
}
}
printf("后半部分拷贝成功\n");
}
if(close(pn1)<0)
{
perror("close");
return -1;
}
if(close(pn2)<0)
{
perror("close");
return -1;
}
return 0;
}
实现效果: