Processus (HWP) multiple C sous UNIX?

cbismuth Messages postés 10 Date d'inscription dimanche 5 septembre 2004 Statut Membre Dernière intervention 29 octobre 2004 - 6 oct. 2004 à 21:11
cbismuth Messages postés 10 Date d'inscription dimanche 5 septembre 2004 Statut Membre Dernière intervention 29 octobre 2004 - 7 oct. 2004 à 20:57
Bonjour à tous!

Une question me rend fou depuis plusieurs jours...

Je souhaite créer N processus (HWP, pas des threads) en C sous UNIX avec une boucle "for" et l'appel "fork()". Mon idée était la suivante (peu importe le code des fonctions fils() et pere() appelée):

1  #define N 10
2 
3  int main() {
4    register int i;
5    for(i = 0; i < N; i++) {
6      switch(fork()) {
7         case -1: return(1);
8         case 0: fils(); break;
9         default: pere(); wait(0); break;
10     }
11   }
12   return(0);
13 }


Après mûre (et longue...) reflexion, je me suis dis:
"...du fait que l'appel fork() duplique le processus et donc la section de code qui précede son appel, la boucle "for" est également dupliquée! Chaque fils exécutera donc une boucle "for" et donc un fork(), non?"

Si quelqu'un voit comment créer N processus HWP, merci de me faire signe...

Christophe

4 réponses

cbismuth Messages postés 10 Date d'inscription dimanche 5 septembre 2004 Statut Membre Dernière intervention 29 octobre 2004
6 oct. 2004 à 21:16
Précision:
Ce code produit une infinité de processus fils, et non pas 10 comme souhaité...
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
6 oct. 2004 à 22:56
salut,
il faut que tu choisisses un des deux cas ou tu sortes de ta boucle; par exemple dans le cas ou le fork retourne 0, execute ta procédure fils(); mais apres sors de ton for(;;)... celui ci sera continué par le processus pere. dans ce cas, seul le processus pere original va executer la boucle, car chaque processus fils crée n'essaiera plus de la continuer, resultat seuls N processus seront crées. avec ton code, tu as crée 2^N processus comme tu sembles l'avoir compris et remarqué...

a++ ;)
0
cbismuth Messages postés 10 Date d'inscription dimanche 5 septembre 2004 Statut Membre Dernière intervention 29 octobre 2004
7 oct. 2004 à 20:05
Tu as raison! Mais comment sortir cette boucle proprement sans utiliser l'instruction "goto", puisqu'il existe deux niveaux d'imbrication?
Peut-être qu'avec un test de pid je peux arriver, du genre:

1 #define N 10
2 
3 int main() {
4 register int i, pid;
5 for(i = 0; i < N; i++) {
6 switch(pid = fork()) {
7 case -1: return(1);
8 case 0: fils(); break;
9 default: pere(); wait(0); break;
10 }
11 if (pid == 0) break;
12 }
13 return(0);
14 }


A vue d'oeil, je pense que cela marche: merci bôcoup!

3029 ...
3030fprintf(stderr, "c'est au pied du mur qu'on voit le mieux le mur...");
3031...


@+
Christophe
0
cbismuth Messages postés 10 Date d'inscription dimanche 5 septembre 2004 Statut Membre Dernière intervention 29 octobre 2004
7 oct. 2004 à 20:57
IMPECABLE MERCI!

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

#define N 10

int main() {
register int i, pid;
for(i = 0; i < N; i++) {
switch(pid = fork()) {
case -1: return(1);
case 0: printf("fils n°%d\n", i); break;
default: wait(0); break;
}
if (pid == 0) break;
}
return(0);
}
0
Rejoignez-nous