1

我有这个代码:

    int main ()
{
  int pid, fd[2], i, j;
  char comanda[1000], comm[100][100], *var, *var2, vect[100][100], check[10000];
  if(pipe(fd)<0) // nu creaza pipe-ul
  {
    perror("pipe error");
    exit(1);
  }
  if((pid = fork()) < 0 ) //nu face fork
  {
    perror("fork error");
    exit(1);
  }
  j = 0;
  if(pid){ 
      do {
        if( j > 0) fgets (check , 1000 , stdin); 
        printf("enter command: \n");
        scanf("%[^\t\n]", comanda);
        if(var = strtok(comanda, " "))
        {
          i=0;
          while(var != NULL)
          {
            strcpy(vect[i], var);
            var = strtok(NULL, " ");
            i++;
          }
        }
        else
          strcpy(vect[0], comanda);
        if(strcmp(vect[0], "login") == 0)
        {
            write(fd[1], "login ", 6);
            write(fd[1], vect[1], strlen(vect[1]));
            printf("Sending the child %s \n", vect[1]);
        }
        else if(strcmp(vect[0], "quit") == 0)
        {
          exit(1);
        }
        else
          printf("I got the command %s \n", vect[0]);
        j++;
      } while(1);
      close(fd[0]);
      close(fd[1]);
      wait(NULL);
  }
  else
  {
      do
      {
          char text[1000];
          close(fd[1]); 
          int i=0;
          strcpy(text, "");
          read(fd[0], text, sizeof(text));
          printf("I've read %s \n", text);
          var2 = strtok(text, " ");
          j=0;
          while(var2 != NULL)
          {
            strcpy(comm[j], var2);
            var2 = strtok(NULL, " ");
            j++;
          }
          if( strcmp(comm[0], "login") == 0)
          {
              printf("comm[1] e %d \n", comm[1]);
              if(login(comm[1]))
              {
                printf("OKK! \n");
              }
              else
              {
                printf("Username not in /etc/passwd \n");
              }
          }

          //close(fd[0]);
      } while(1);
  }
  return 0;
} 

现在的问题是……在父进程中读取命令时……如果我让他登录 adam.johnson ……它会将 adam.johnson 很好地发送到他工作的约翰逊……现在,当它返回父进程时,如果我再次给他login wa,它将从父进程读取为login waam.johnson(保留 am.johnson 来自 adam.johnson,这很糟糕!

4

1 回答 1

0

在孩子中,您没有使用调用read(读取的字节数) 的返回值,并且在父母中,您没有发送结束字符串的 nul char。因此,在孩子中,当您发送比最后一个字符串短的字符串时,您正在重用上次读取的缓冲区的一部分。

您可以尝试在父级中发送 nul 字符:

write(fd[1], "login ", 6);
write(fd[1], vect[1], strlen(vect[1]) +1);
于 2012-10-23T18:56:05.997 回答