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 に答える