叉子和管道运行不好,它们同时执行

时间:2012-10-23 09:40:11

标签: c fork pipe

这是我目前的代码片段:

 int main () 
  {
  int pid, fd[2], i;
  char comanda[1000], *var, vect[100][100], text[100];
  if((pid = fork()) < 0 )
  {
    perror("fork error");
    exit(1);
  }
  if(pid){ 
      printf("enter command: \n");
      scanf("%[^\t\n]", comanda);
      close(fd[0]);
      close(0);
      var = strtok(comanda, " ");
      i=0;
      while(var != NULL)
      {
        strcpy(vect[i], var);
        var = strtok(NULL, " ");
        i++;
      }
      if(strcmp(vect[0], "login") == 0)
      {
          write(fd[1], "login", 5);
          printf("I got login");
      }
      close(fd[1]);
      wait(NULL);
  }
  else
  {
      close(fd[0]); 
      int i=0;
      read(fd[0], &text, sizeof(text));
      printf("This is the child ");
      exit(0);
  }
  return 0;
} 

而预期的输出是:

  1. 输入命令:
  2. 我在这里输入命令 -
  3. 他在管道中写道
  4. 他写道“我登录了”
  5. 他进入孩子并处理我的文字
  6. 我得到的输出有点奇怪:

    1. 从父母输入命令:“然后
    2. 这是孩子的“孩子”?!?!?!来自哪里?!?!
    3. 询问输入,scanf
    4. 从父母那里写下“我登录”。
    5. 这有点奇怪,我想要的只是在父级中读取内容,在管道中写入并将其发送到子进程,该进程实际上应该对该值执行某些操作。

1 个答案:

答案 0 :(得分:2)

无处初始化fd数组,以便它实际上包含有效的文件描述符。因此,孩子对read的调用立即失败,文件描述符无效(您应该检查所有系统调用的返回代码),这解释了孩子的“意外”输出。

在父级中(即在调用fork之前),您需要按如下方式初始化fd

pipe(fd);

并删除

close(fd[0]);

来自孩子,因为你需要阅读那个fd。