0

这是我目前拥有的一段代码:

 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. 他进入孩子并处理我的文字

我得到的输出有点奇怪:

  1. “输入命令:”来自父级......然后
  2. “这是孩子”来自孩子?!?!?!从哪里?!?!
  3. 询问输入,scanf
  4. 从父母那里写“我登录了”。

这有点奇怪,我想要的只是在父进程中读取某些内容,在管道中写入并将其发送到子进程,该子进程实际上应该使用该值执行某些操作。

4

1 回答 1

2

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

在父级中(即在调用之前fork),您需要进行fd如下初始化:

pipe(fd);

并删除

close(fd[0]);

从孩子那里,因为您需要从该 fd 中读取。

于 2012-10-23T09:46:19.947 回答