cbismuth
Messages postés10Date d'inscriptiondimanche 5 septembre 2004StatutMembreDernière intervention29 octobre 2004
-
6 oct. 2004 à 21:11
cbismuth
Messages postés10Date d'inscriptiondimanche 5 septembre 2004StatutMembreDernière intervention29 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...
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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é...
cbismuth
Messages postés10Date d'inscriptiondimanche 5 septembre 2004StatutMembreDernière intervention29 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...