1.拷贝图片
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include<stdio.h>
#include<string.h>
#define ERR_MSG(msg){printf("line:%d\n",__LINE__);perror(msg);}
int main(int argc, const char *argv[])
{
char str[32]="";
size_t res_r=0;
size_t res_w=0;
char c=0;
//打开源文件并判断
int ft_r=open("../Pictures/10.png",O_RDONLY);
if(ft_r<0)
{
ERR_MSG("open");
return -1;
}
//打开目标文件并判断
int ft_w=open("../Pictures/7.png",O_WRONLY|O_CREAT,0777);
if(ft_w<0)
{
ERR_MSG("open");
return -1;
}
//获取文件大小
off_t size_r=lseek(ft_r,0,SEEK_END);
//创建子进程并判断
pid_t t=fork();
if(t<0)
{
ERR_MSG("fork");
return -1;
}
//子进程执行区域
else if(0==t)
{
lseek(ft_r,size_r/2+1,SEEK_SET); //防止文件大小为奇数,后半段为size_r+1;后半段为:size_t-1
lseek(ft_w,size_r/2+1,SEEK_SET);
while(1)
{
res_r=read(ft_r, str, sizeof(str));
if(res_r<0)
{
ERR_MSG("read");
return -1;
}else if(0==res_r)
{
break;
}
res_w=write(ft_w, str,res_r);
if(res_w<0)
{
ERR_MSG("write");
return -1;
}
bzero(str,sizeof(str));
}
}
//父进程执行区域
else if(t>0)
{
sleep(2); //休眠2s,等待子进程县拷贝后半段
lseek(ft_r,0,SEEK_SET);
lseek(ft_w,0,SEEK_SET);
for(int i=0;i<(size_r/2)+1;i++)
{
res_r=read(ft_r, &c, sizeof(char));
if(res_r<0)
{
ERR_MSG("read");
return -1;
}
res_w=write(ft_w,&c ,res_r);
if(res_w<0)
{
ERR_MSG("write");
return -1;
}
}
//关闭文件并判断
if(close(ft_r)<0)
{
ERR_MSG("close");
return -1;
}
if(close(ft_w)<0)
{
ERR_MSG("close");
return -1;
}
return 0;
}