C叉父母和孩子之间的两个孩子和管道

时间:2013-05-05 00:38:55

标签: c fork pipeline

我试图分叉两个孩子。父读取一行发送到管道。孩子一读它并将其写入另一个管道,最后child2读取它。但是,输出始终是父获取行。谢谢!

#define MAX 80

void child();
void parent();
void childtwo();
char * getli();
void printline(char *buffer, int count);
char * convertCase(char *str);

int pipe1[2]; 
int pipe2[2];
int main(int argc, char **argv)
{
  pipe(pipe1);
  pipe(pipe2);
  if(fork()){
    if(fork()){ 
      printf("1st\n");
      parent();
          exit(0);
    }
    else{
      printf("3rd\n");
      childtwo();
      exit(0);
    }   
  }
  else{
    printf("2nd\n");
    child();
    exit(0);
  }
}

void child(){
  char *buf;
  int count = 0;
  close(pipe1[1]); 
  close(pipe2[0]);   
  while(1){ 
  buf = (char *) malloc(sizeof(char)*MAX);
  read(pipe1[0], buf, MAX);
  if (strcmp(buf,"quit")== 0){
    printf("Child is leaving\n");
    free(buf);
    break;
  }
  else{
    printf("Child: ");
    printline(buf,strlen(buf));
    write(pipe2[1],buf, strlen(buf)+1);
    free(buf);
        }
  close(pipe2[1]);
  close(pipe1[0]);
  exit(0);
  }
}

void childtwo()
{
  char *buf;
  int count = 0;
  close(pipe2[1]);
  buf = (char *) malloc(sizeof(char)*MAX); 
  while(1){
    buf = (char *) malloc(sizeof(char)*MAX);
    read(pipe2[0], buf, MAX);
    if (strcmp(buf,"quit")== 0){
      printf("Childtwo is leaving\n");
      free(buf);
      break;
    }
    else{
      printf("Childtwo:");
      printline(buf,strlen(buf));
      free(buf);   
    }
  }
  close(pipe2[0]);
  exit(0);
}

void parent(){
  char * buffer;
  int count = 0, done=0;
  close(pipe1[0]);
  while (done != 1){
    printf("parent getting line: ");
    buffer = getli();
    write(pipe1[1],buffer, strlen(buffer)+1);
    if (strcmp(buffer,"quit")== 0){
      puts("parent goes away");
      free(buffer);
      break;
    }
    free(buffer);
  }
  close(pipe1[1]);
  exit(0);
}

1 个答案:

答案 0 :(得分:0)

我的猜测是它适用于第一行,但不适用于任何其他行。

这是因为第一个子进程(在child函数中)在读取其输入后退出。您可能打算将closeexit调用放在循环之外。