代码
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define MSG_ERR(msg){\
fprintf(stderr,"line:%d",__LINE__);\
perror(msg);\
}
int main(int argc, const char *argv[])
{
//为了避免后面可能会出现的偏移量问题,提前使用fork函数打开子进程
//让子进程和父进程操作的内核空间中的系统文件表不是同一个
pid_t pid = fork();
//以读的方式打开文件
int fd_r=open("./1.png",O_RDONLY);
if(fd_r<0)
{
MSG_ERR("open");
return -1;
}
//以写的方式打开文件
int fd_w=open("./2.png",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd_w<0)
{
MSG_ERR("open");
return -1;
}
//接收文件大小
off_t size = lseek(fd_r,0,SEEK_END);
//判断文件大小为奇数还是偶数
int flag = size%2==0?0:1;
//父进程操作
if(pid>0)
{
sleep(2);
//修改文件偏移量到0的位置
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
char c = 0;
//循环写入
for(int i=0;i<size/2;i++)
{
if(read(fd_r,&c,1)<0)
{
MSG_ERR("read");
return -1;
}
if(write(fd_w,&c,1)<0)
{
MSG_ERR("write");
return -1;
}
}
printf("前半部分拷贝完成\n");
}
//子进程操作
else if(pid==0)
{
//修改文件偏移量到size/2的位置
lseek(fd_r,size/2,SEEK_SET);
lseek(fd_w,size/2,SEEK_SET);
char c = 0;
//循环写入
for(int i=0;i<size/2+flag;i++)
{
if(read(fd_r,&c,1)<0)
{
MSG_ERR("read");
return -1;
}
if(write(fd_w,&c,1)<0)
{
MSG_ERR("write");
return -1;
}
}
printf("后半部分拷贝完成\n");
}
else if(pid<0)
{
MSG_ERR("fork");
return -1;
}
//关闭文件
close(fd_r);
close(fd_w);
return 0;
}
执行结果