1> 创建出三个进程完成两个文件之间拷贝工作,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程回收子进程的资源
#include <myhead.h>
//使用三个进程完成两个文件的拷贝工作
//两个子进程分别拷贝文件的上下两部分
//父进程回收资源int main(int argc, const char *argv[])
{//判断外部传参if(argc!=3){printf("input file error\n");printf("usage: ./a.out inputfile outfile\n");return -1;}int srcfd=-1,dstfd=-1,fd=-1;char buf[10]="";//计算文件中间的位置if((fd=open(argv[1],O_RDONLY))==-1){perror("open file error");return -1;}int pos=lseek(srcfd,0,SEEK_END)/2;//创建第一个子进程pid_t pid1=-1;pid1=fork();if(pid1 == 0) {printf("我是老大,我来拷贝上半部分\n");//打开源文件if((srcfd=open(argv[1],O_RDONLY))==-1){perror("1 open srcfile error");return -1;}//打开目标文件if((dstfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){perror("1 open dstfile error");return -1;}//拷贝int count=0;while(1){memset(buf,0,sizeof(buf));int res=read(srcfd,buf,sizeof(buf));write(dstfd,buf,res);count+=res;if(count>=pos){break;}}//关闭close(srcfd);close(dstfd);printf("上半部分拷贝完成\n");exit(EXIT_SUCCESS);}else if(pid1 > 0){//创建第二个子进程pid_t pid2=fork();if(pid2 == 0){printf("我是老二,我来拷贝下半部分\n");//打开源文件if((srcfd=open(argv[1],O_RDONLY))==-1){perror("2 open srcfile error");return -1;}//打开目标文件if((dstfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){perror("2 open dstfile error");return -1;}//偏移光标lseek(srcfd,pos,SEEK_SET);//拷贝while(1){memset(buf,0,sizeof(buf));int res=read(srcfd,buf,sizeof(buf));write(dstfd,buf,res);if(res==0)break;}//关闭close(srcfd);close(dstfd);printf("下半部分拷贝完成\n");sleep(3);exit(EXIT_SUCCESS);}else if(pid2 > 0){printf("我是父进程\n");sleep(5);wait(NULL);printf("回收一个子进程\n");wait(NULL);printf("回收一个子进程\n");}else{perror("fork2 error");return -1;}}else{perror("fork1 error");return -1;}return 0;
}