作业 : 使用两个子进程完成两个文件的拷贝,子进程1拷贝前一半内容,子进程2拷贝后一般内容,父进程用于回收两个子进程的资源
#include <head.h>int main(int argc, const char *argv[])
{int rd = -1;if((rd=open("./01_test.c",O_RDONLY))==-1) //打开一个文件以只读的方式{perror("open error\n");return -1;}int wd = -1; //以写的方式打开一个文件,若文件不存在则创建,存在则清空if((wd=open("./text.txt",O_WRONLY|O_CREAT|O_TRUNC, 0664))==-1){perror("write error\n");return -1;}char res[128]=""; //定义一个字符串当中转站int seek = lseek(rd,0,SEEK_END); //定义seek获取文件内容的大小,lseek函数的返回值是文件的大小int count = 0; //定义count来接收read的返回值int pid = fork(); //创建子进程if(pid > 0) //如果pid大于0则为父进程 {//父进程//回收子进程的资源wait(NULL);wait(NULL);int pid2 = fork(); //在父进程中再创建子进程if(pid2>0) //父进程{ }else if(pid2 == 0) //再次创建的子进程{//子2进程 lseek(rd,0,SEEK_SET); //将光标偏移到文件开头while(1){if(seek/2 == lseek(rd,0,SEEK_CUR)) //如果文件偏移到文件中间,则跳出循环{break;}count=read(rd,res,sizeof(res)); //读写文件write(wd,res,count);}exit(EXIT_SUCCESS); //退出子进程}else{perror("pids error\n");return -1;}}else if(pid == 0) //子2进程{ //休眠1秒等另一个进程拷贝完毕sleep(1);//光标移动到文件中央lseek(rd, 0, SEEK_CUR);while(1){if(count==0) //如果read的返回值为0,说明文件读取完毕,跳出循环{break;}count = read(rd,res,sizeof(res)); //读写文件write(wd,res,count);}exit(EXIT_SUCCESS); //退出子进程} else{perror("pidx error\n");return -1;}printf("拷贝完成\n");close(wd);close(rd);return 0;
}
思维导图