1.使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程的资源
程序代码:
1 #include<myhead.h>2 int main(int argc, const char *argv[])3 {4 //判断传入的文件个数5 if(argc!=3)6 {7 printf("input error\n");8 printf("usage:./a.out srcfile destfile\n");9 return -1;10 }11 //定义进程号变量12 pid_t pid=-1;13 //定义文件描述符变量14 int src,dest;15 //以只读形式打开源文件16 if((src=open(argv[1],O_RDONLY))==-1)17 {18 perror("open src error");19 return -1;20 }21 //以只写的形式打开目标文件22 if((dest=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)23 {24 perror("open dest error");25 return -1;26 }27 //光标求源文件大小28 int len=lseek(src,0,SEEK_END);29 //创建一个子程序30 pid=fork();31 //判断父子进程执行的程序代码32 if(pid>0)33 {34 //两个文件定位到起始处35 lseek(src,0,SEEK_SET);36 lseek(dest,0,SEEK_SET);37 //循环将源文件中的字符拷贝到目标文件38 //定义容器存储读取的文件内容39 char buf[128]="";40 //每次读取的字符数41 int res=0;42 //读取的总字数43 int sum=0;44 while(1)45 {46 res=read(src,buf,sizeof(buf));47 sum+=res;48 if(sum>=len/2||res==0)49 {50 write(dest,buf,res-(sum-len/2));51 break;52 }53 write(dest,buf,res);54 }55 }else if(pid==0)56 {57 lseek(src,len/2,SEEK_SET);58 lseek(dest,len/2,SEEK_SET);59 char duf[128]="";60 int reb=0;61 int sun=0;62 while(1)63 {64 reb=read(src,duf,sizeof(duf));65 sun+=reb;66 if(sun>=len-(len/2)||reb==0)67 {68 write(dest,duf,reb-(sun-(len-len/2)));69 break;70 }71 write(dest,duf,reb);72 }73 exit(EXIT_SUCCESS);74 }else75 {76 perror("pid error");77 return -1;78 }79 wait(NULL);//阻塞等待子进程结束80 printf("success\n");81 //关闭文件82 close(src);83 close(dest);84 return 0;85 }
运行结果:
流程图: