#include <myhead.h>
int main(int argc, const char *argv[])
{if (argc!=3){fprintf(stderr,"输入错误:%s <源文件> <目标文件>\n",argv[0]);exit(EXIT_FAILURE);}//打开源文件int fd=open(argv[1],O_RDONLY);if(fd==-1){perror("open error");exit(EXIT_FAILURE);}//计算源文件大小//把光标移到文件末尾off_t size=lseek(fd,0,SEEK_END);//返回光标所在位置//失败返回-1;if(size==-1){perror("error seek file");close(fd);exit(EXIT_FAILURE);}//计算一半的数int helf_size=size/2;//创建目标文件int fd1=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644); if(fd1==-1){perror("open error");close(fd);exit(EXIT_FAILURE);}//创建第一个子进程pid_t pid=fork();if(pid==-1){perror("create error");close(fd);close(fd1);exit(EXIT_FAILURE);}if(pid==0){//把文件光标移到文件开始lseek(fd,0,SEEK_SET);lseek(fd1,0,SEEK_SET);//定义一个缓冲区char buffer[20]="";//读取并写入前半部分int byte_read;while((byte_read=read(fd,buffer,sizeof(buffer)<helf_size?sizeof(buffer):helf_size))>0){write(fd1,buffer,byte_read);}exit(EXIT_FAILURE);}//创建第二个子进程pid_t pid1=fork();if(pid1==-1){perror("create error");close(fd);close(fd1);exit(EXIT_FAILURE);}if(pid1==0){//把光标位置移到文件一半的位置lseek(fd,helf_size,SEEK_SET);lseek(fd1,helf_size,SEEK_SET);//把文件后半部分读取到argv[2]文件中int temp=size-helf_size;int byte_read;char buffer[20];while((byte_read=read(fd,buffer,sizeof(buffer)<temp?sizeof(buffer):temp))>0){write(fd1,buffer,byte_read);}exit(EXIT_FAILURE);}//关闭文件close(fd);close(fd1);//回收两个子进程waitpid(pid,NULL,0);waitpid(pid1,NULL,0);return 0;
}
#include <myhead.h>int main(int argc, const char *argv[])
{if(argc!=3){printf("Usage: %s <源文件> <目标文件>\n",argv[0]);exit(EXIT_FAILURE);}//打开源文件int fd=open(argv[1],O_RDONLY);if(fd==-1){perror("open error");exit(EXIT_FAILURE);}//获取源文件的大小//把光标移到文件结尾位置,lseek函数,成功返回光标的当前位置,失败返回-1,并置位错误码off_t size=lseek(fd,0,SEEK_END);off_t helf_size=size/2;if(size==-1){perror("error");close(fd);exit(EXIT_FAILURE); }//创建目标文件int fd1=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);if(fd1==-1){perror("open error");close(fd1);exit(EXIT_FAILURE);}//创建子进程pid_t pid=fork();if(pid==-1){perror("create error");exit(EXIT_FAILURE);}if(pid>0)//父进程处理前半部分{//把源文件光标移到文件开头lseek(fd,0,SEEK_SET);//把目标文件光标移动文件开头lseek(fd1,0,SEEK_SET);//读取前半部分并写入char arr[50]="";int byte_read;while(helf_size>0&&(byte_read=read(fd,arr,sizeof(arr)<helf_size ? sizeof(arr):helf_size))>0){write(fd1,arr,byte_read);}close(fd);close(fd1);exit(EXIT_FAILURE);}else if(pid==0)//子进程处理后半部分{//把光标移到文件一半的位置lseek(fd,size/2,SEEK_SET);lseek(fd1,size/2,SEEK_SET);char arr[50]="";int byte_read;int temp=size-helf_size;while((byte_read=read(fd,arr,sizeof(arr)<temp?sizeof(arr):temp))>0){write(fd1,arr,byte_read);}close(fd);close(fd1);exit(EXIT_FAILURE);}return 0;
}

