【无标题】

#include"kernel/types.h"
#include"kernel/stat.h"
#include"user/user.h"

const int pSize = 35;

int main(int argc, char *argvs[]){
  int p[2], num, prime;
  pipe(p);
  
  if(fork() == 0){
    //chPro
    close(p[1]);
    while(1){
      //In fact, this part of program may be used by grandPro
      read(p[0], &prime, sizeof(int));
      if(prime!=pSize)printf("prime: %d\n",prime);
      
      //Hard to realize is that when you repipe fd, you disconnected with
      //the old pipe;
      int fd[2];
      pipe(fd);
    
      //chPro pipe1 r,pipe2 rw
      //chPro target: read from pipe1,write to pipe2, need p[0] fd[1] only
      //prime equals pSize means the end of forking new pro, we need to exit
      //this pro
      if(fork() != 0 || prime == pSize){
      	close(fd[0]);
      	//if not end of pro
      	if(prime != pSize){
      	  //read from pipe1 and write into pipe2
      	  read(p[0],&num,sizeof(int));
      	  while(num != pSize){
      	    if(num%prime)write(fd[1],&num,sizeof(int));
      	    read(p[0],&num,sizeof(int));
      	  }  
      	  write(fd[1],&num,sizeof(int));
      	}
      	close(p[0]);
      	close(fd[1]);
      	//chPro detatched from pipe1 & pipe2,only wait to be exit
      	wait(0);
      	exit(0);
      }
      else{
        //grandPro target: read from pipe2 & write to pipe3
        //to reuse the program of while, redirect fd[0] to p[0]
        close(p[0]);
        p[0] = fd[0];
        close(fd[1]);
      }
    }
  }
  else{
    close(p[0]);
    for(int i = 2; i <= pSize; i++)
      write(p[1], &i, sizeof(int));
    //Here parentPro has disconnected to pipe
    wait(0);
  }
  exit(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值