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(読み取られたバイト数)を使用していません。また、親では、文字列を終了するヌル文字を送信していません。したがって、子では、最後の文字列よりも短い文字列を送信したときに、最後に読み取られたバッファの一部を再利用しています。

親でnulcharを送信してみてください。

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