程序运行代码
#include <stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main(int argc, const char *argv[])
{
//以读的方式打开1.png
int fd_r = open("./1.png",O_RDONLY);
//以写的方式打开2.png
int fd_w = open("./2.png",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd_r<0 || fd_w<0)
{
perror("open");
return -1;
}
//文件大小
off_t size = lseek(fd_r,0,SEEK_END);
//判断文件大小奇偶性
int flag = size%2 == 0?0:1;
pid_t pid = fork();
//子进程先运行打印后半部分
if(0 == pid)
{
//修改文件偏移量到文件中心
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)
{
perror("read");
return -1;
}
if(write(fd_w,&c,1)<0)
{
perror("write");
return -1;
}
}
printf("后半部分拷贝完毕\n");
}
//父进程后打印前半部分
else if(pid>0)
{
sleep(2);
//修改文件偏移量到开头
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)
{
perror("read");
return -1;
}
if(write(fd_w,&c,1)<0)
{
perror("write");
return -1;
}
}
printf("前半部分拷贝完毕\n");
}
else if(pid <0)
{
perror("fork");
return -1;
}
//关闭
close(fd_r);
close(fd_w);
return 0;
}
运行结果