#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义外部传参个数
if(argc!=3)
{
printf("input file error\n");
printf("usage: ./a.out srcfile dstfile\n");
return -1;
}
/*************************************************************/
//定义一个子进程号类型
pid_t pid;
pid = fork(); //创建了一个子进程
if(pid < 0)
{
perror("fork error");
return -1;
}
else if(pid == 0) //我是子进程
{
//定义源文件描述符
int srcfd;
if((srcfd=open(argv[1],O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
//定义目标文件描述符
int dstfd;
if((dstfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666))==-1)
{
perror("open dstfile error");
return -1;
}
//求源文件的大小
int size = lseek(srcfd,0,SEEK_END);
char buf[200]; //定义一个搬运工暂存源文件的内容
int ret; //用返回值来接受读的内容
//读源文件前一般内容写入目标文件
while((ret = read(srcfd,buf,sizeof(buf)))>0)
{
//写到目标文件中去
write(dstfd,buf,ret);
//当写入到一半的时候,退出
if(lseek(dstfd,0,SEEK_CUR)>=size/2)
{
break;
}
}
//关闭文件描述符
close(srcfd);
close(dstfd);
}
}
else /*********************我是父进程*****************/
{
//定义源文件描述符
int srcfd;
if((srcfd=open(argv[1],O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
//定义目标文件描述符
int dstfd;
if((dstfd=open(argv[2],O_WRONLY|O_CREAT|O_APPEND,0666))==-1)
{
perror("open dstfile error");
return -1;
}
//求源文件的大小
int size = lseek(srcfd,0,SEEK_END);
//将光标移到源文件一半的位置
lseek(srcfd,size/2,SEEK_SET);
char buf[200]; //定义一个搬运工暂存源文件的内容
int ret; //接收read返回值
//读源文件后一般内容写入目标文件
if(size>size/2)
{
while((ret = read(srcfd,buf,sizeof(buf)))>0)
{
write(dstfd,buf,ret);
}
}
//关闭文件描述符
close(srcfd);
close(dstfd);
}
return 0;
}
