0

以前、Cでfork()とパイプを使用 することについて質問を投稿しました。通常のtxtファイルを読み取り、ファイル内の単語を並べ替えるように、デザインを少し変更しました。これまでのところ、これは私が思いついたものです:

 for (i = 0; i < numberOfProcesses; ++i) {
    // Create the pipe
    if (pipe(fd[i]) < 0) {
      perror("pipe error");
      exit(1);
    }

    // fork the child
    pids[i] = fork();
    if (pids[i] < 0) {
      perror("fork error");
    } else if (pids[i] > 0) {     
      // Close reading end in parent
      close(fd[i][0]);

    } else {     
      // Close writing end in the child
      close(fd[i][1]);

      int k = 0;
      char word[30];

      // Read the word from the pipe
      read(fd[i][0], word, sizeof(word));

      printf("[%s]", word);    <---- **This is for debugging purpose**

     // TODO: Sort the lists  
    }
  }


  // Open the file, and feed the words to the processes
  file_to_read = fopen(fileName, "rd");

  char read_word[30];
  child = 0;

  while( !feof(file_to_read) ){
    // Read each word and send it to the child
    fscanf(file_to_read," %s",read_word);

    write(fd[child][1], read_word, strlen(read_word));
    ++child;
    if(child >= numberOfProcesses){
      child = 0;
    }
  }

ここnumberOfProcessesで、はコマンドライン引数です。つまり、ファイル内の各単語を読み取り、それをプロセスに送信します。ただし、これは機能しません。子プロセスで単語を印刷すると、正しい出力が得られません。パイプとの間で単語を正しく読み書きしていますか?

4

2 に答える 2

1

親ではstrlen()、30バイト未満のバイトを書き込みます。ただし、子では、常に30バイトを読み取ろうとします。また、単語をNULで終了する必要があります。そうしないと、printf()ステートメントにゴミや暴走文字列が表示される可能性があります。

子では、単語の境界で入力を解析して分割するか、@JonathanLefflerが提案したようにstdioを使用する必要があります。stdioを使用すると、このすべてのバッファリングと単語の読み取りを無料で利用できます。

int n;
char word[31];

/* Read the word from the pipe */
n = read(fd[i][0], word, sizeof(word) - 1);
if (n == -1) {
    perror("read");
    /* do error handling */
} else {
    word[n] = 0;
    printf("[%s]", word);
}
于 2012-11-04T21:56:26.150 に答える
1

単語が間違った順序で印刷されたり、インターリーブされたりしていませんか?重要なのは、パイプに単語を書き込むとき、そのパイプを処理するプロセスがすぐにスケジュールされ、単語を出力することを期待しているということです。次に、メインプロセスが再度実行され、次の単語が次のパイプなどに書き込まれることを期待します。

しかし、それが起こるとは限りません。メインループは、他のプロセスがスケジュールされる前に、すべての単語をすべてのパイプに書き込む場合があります。これらのプロセスは、期待した順序でスケジュールされていない可能性があります。また、printf呼び出しが相互に干渉して、出力がインターリーブされる可能性があります。

設定したことを本当に実行したい場合は、Posixスレッドの方が適しています。複数のプロセスの使用について何かを学びたいだけなら、私はあなたが持っていると思います:-)

于 2012-11-04T22:10:24.773 に答える