作業 :? 使用兩個子進程完成兩個文件的拷貝,子進程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;
}
思維導圖