2

私はいくつかの並列プログラミング(マルチプロセッシング)を行っており、親に次のことを行う必要があります。

  1. Fork数人の子供

  2. すべての子が作成されたら、すべてが終了するのを待ちます

  3. すべての子が終了したら、他の作業を行います。

これは私が試したものです:

 int main(int argc, char **argv[])
{

  int j, i;
  pid_t children[3];
  int pid;

  // Fork the processes
  for(j = 0; j < 3; j++){
    if((children[j] = fork()) == 0){
      // Child process
      for(i = 0; i < 2; i++){
        printf("child %d printing: %d\n", j, i);
      }
    }else {
        // In parent now
        while (pid = waitpid(-1, NULL, 0)) {
            if (errno == ECHILD) {
                break;
            }
        }
        
        printf("all children terminated. in parent now\n");
    }
  }

  return 0;
}

正しい出力が得られません。すべての子が死亡する前であっても、「すべての子が終了しました。今親で」が数回出力されます。また、プロセスごとに 2 つの出力しか表示されないはずですが、それ以上の出力が表示されます。

4

2 に答える 2

2

これはあなたが達成しようとしていることですか?並列化の可視性を高めるために、遅延を使用して各子に単純なカウントを設定しました。

#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char **argv[])
{
  int i, j, k;
  int pid;

  // Fork the processes
  for(j = 0; j < 3; j++)
  {
    if (fork() == 0)
    {
        printf("starting child %d\n", j);
        // Child process - do your child stuff
        for (i = 0; i < 5; ++i)
        {
          for (k = 0; k < 10000000; ++k);
          printf("child %d printing: %d\n", j, i);
        }
         printf("child %d ending\n", j);
        // then just quit
        exit(0);
    }
  }

  j = 1;
  while (wait(NULL) > 0)
  {
    printf("%d child completed\n", j++);
  }

  // In parent now
  printf("all children terminated. in parent now\n");

  return 0;
}

私が得る出力は

starting child 0
starting child 1
child 0 printing: 0
starting child 2
child 1 printing: 0
child 0 printing: 1
child 2 printing: 0
child 1 printing: 1
child 0 printing: 2
child 0 printing: 3
child 2 printing: 1
child 1 printing: 2
child 1 printing: 3
child 0 printing: 4
child 0 ending
child 2 printing: 2
1 child completed
child 1 printing: 4
child 1 ending
2 child completed
child 2 printing: 3
child 2 printing: 4
child 2 ending
3 child completed
all children terminated. in parent now
于 2012-11-20T02:21:58.300 に答える
1

各子はループとフォークを実行しています。j出力を印刷した後、ループから抜け出す必要があります。これらの孫は元の親の子ではなく、第 1 世代の子は孫を待っていないため、出力の順序は指定されていません。また、waitpidすべての子がフォークされるまで、j ループを実行しないようにする必要があります。

于 2012-11-20T01:37:44.597 に答える