web-dev-qa-db-fra.com

Processus de plusieurs enfants

quelqu'un peut-il m'aider à créer de multiples processus d'enfants qui ont le même parent afin de faire "certaines" une partie de travail particulier?

par exemple, un algorithme de tri externe appliqué avec des processus d'enfants; Chaque processus enfant trie une partie des données et finalement le parent les fusionne ..

EDIT: Peut-être que je devrais mentionner la fourchette de plusieurs processus enfants avec une boucle ..

13
israkir

Voici comment Fork 10 enfants et attendre qu'ils finissent:

pid_t pids[10];
int i;
int n = 10;

/* Start children. */
for (i = 0; i < n; ++i) {
  if ((pids[i] = fork()) < 0) {
    perror("fork");
    abort();
  } else if (pids[i] == 0) {
    DoWorkInChild();
    exit(0);
  }
}

/* Wait for children to exit. */
int status;
pid_t pid;
while (n > 0) {
  pid = wait(&status);
  printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
  --n;  // TODO(pts): Remove pid from the pids array.
}
45
pts

Je pense que cela mériterait de souligner pourquoi les threads sont plus appropriés ici:

Comme vous essayez de faire une "pièce" du travail en parallèle, je suppose que votre programme doit connaître le résultat du calcul. Fourche () S d'un processus Ne partagez pas plus que les informations initiales après la fourchette (). Chaque changement d'un processus est inconnu à l'autre et vous aurez besoin de transmettre les informations comme message (par exemple à travers un tuyau, voir "Tuyau de l'homme"). Les threads dans un processus partagent le même espace d'adressement et ceux-ci sont en mesure de manipuler des données et de les faire visibles pour faire face à d'autres "immédiatement". Ajout également les avantages d'être plus léger, j'irais avec Pthreads ().

Après tout: vous apprendrez tout ce que vous devez savoir sur Fourchette () si vous utilisez de toute façon Pthreads.

5
pmr

Si vous souhaitez lancer plusieurs fourches, vous devriez le faire de manière récursive. En effet, vous devez appeler Fork du processus parent. Sinon, si vous lancez une deuxième fourchette, vous dupliquez le processus parent et premier enfant. Voici un exemple:

void forker(int nprocesses)
{
    pid_t pid;

    if(nprocesses > 0)
    {
        if ((pid = fork()) < 0)
        {
            perror("fork");
        }
        else if (pid == 0)
        {
            //Child stuff here
            printf("Child %d end\n", nprocesses);
        }
        else if(pid > 0)
        {
            //parent
            forker(nprocesses - 1);
        }
    }
}
5
mjdev

Vous pouvez le faire avec Fourche . Un parent donné peut fourchette aussi mai que possible. Cependant, je suis d'accord avec Avid Pthreads peut être plus approprié.

pid_t firstChild, secondChild;
firstChild = fork();
if(firstChild > 0)
{
  // In parent
  secondChild = fork();
  if(secondChild > 0)
  {
    // In parent
  }
  else if(secondChild < 0)
  {
    // Error
  }
  else
  {
    // In secondChild
  }
}
else if(firstChild < 0 )
{
  // Error
} 
else
{
  // In firstChild
}
3
Matthew Flaschen