Processus enfant multiple

quelqu’un peut-il m’aider sur la façon de créer plusieurs processus enfants qui ont le même parent afin de faire “quelque” partie d’un travail particulier?

par exemple, un algorithme de sorting externe appliqué avec des processus enfants; chaque processus enfant sortinge une partie des données et finalement le parent les fusionne.

EDIT: Peut-être que je devrais mentionner le forgeage de plusieurs processus enfants avec boucle.

    Voici comment bifurquer 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. } 

    Je pense qu’il serait utile de préciser pourquoi les discussions sont plus appropriées ici:

    Comme vous essayez de faire une “partie” du travail en parallèle, je suppose que votre programme doit connaître le résultat du calcul. fork () s d’un processus ne partagent pas plus que l’information initiale après fork (). Chaque modification d’un processus est inconnue de l’autre et vous devez transmettre les informations sous forme de message (par exemple, via un tuyau, voir “man pipe”). Les threads d’un processus partagent le même espace d’adressage et sont donc capables de manipuler des données et de les rendre visibles pour chaque “immédiatement”. Ajoutant également les avantages d’être plus léger, je choisirais pthreads ().

    Après tout: vous apprendrez tout ce que vous devez savoir sur fork () si vous utilisez quand même pthreads.

    Vous pouvez le faire avec une fourchette . Un parent donné peut diviser autant de fois qu’il le souhaite. Cependant, je suis d’accord avec AviD, les pthreads peuvent être plus appropriés.

     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 } 

    Si vous souhaitez lancer plusieurs forks, vous devez le faire de manière récursive. En effet, vous devez appeler fork depuis le processus parent. Sinon, si vous lancez un deuxième fork, vous dupliquez les processus parent et premier. 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); } } }