IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Création imbriquée de processus


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut Création imbriquée de processus
    Bonjour,
    Je parcours le site depuis quelque temps et j'ai décidé de m'inscrire pour vous exposer un petit soucis. Dans le cadre d'un projet, je dois créer une boucle de processus communiquant par tubes anonymes. Je cherche donc à entrer le nombre de "boucles" de programmes à créer à l'exécution et le nombre de programme qu'elles contiendront. J'arrive effectivement à créer des boucles avec le nombre de processus que je désire, mais je ne comprend pas pourquoi les boucles se font plusieurs fois à la suite.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/wait.h>
    #include <fcntl.h>
    #include <string.h>
    #include <errno.h>
     
     
     
     
    void fils(int nbPetale, int numProc, int nbPetMax, int nbProcMax){
    	int pid;
    	printf(" nbPetale:%d numProc:%d nbPetMax:%d nbProcMax:%d \n ", nbPetale, numProc, nbPetMax, nbProcMax);
     
    	if(nbProcMax>1){
    		pid=fork();
    		if(pid==0){
    			fils(nbPetale, numProc+1, nbPetMax, nbProcMax-1);
    		}else{
    			wait(0);	
    		}
    	}
     
     
     
    }
     
    void creerPetale(int nbPetale, int numProc, int nbPetMax, int nbProcMax){
    	int i, pid;
     
    	printf(" nbPetale:%d numProc: %d nbPetMax:%d nbProcMax:%d \n ", nbPetale, numProc, nbPetMax, nbProcMax);
     
    	if(nbProcMax>1){
    		pid=fork();
    		if(pid==0){
    			fils(nbPetale, 2, nbPetMax, nbProcMax-1);
     
    		}else{
    			wait(0);
    		}
    	}
     
    }	
    int main(int argc, char* argv[]){
    	int i;
    	int a[50];
    	char tube[25];
    	char tube2[25];
    	int sortieTube;
    	a[0]=atoi(argv[1]);
    	printf("%d \n", a[0]);
    	if(a[0]==0){
    		exit(0);
    	}
     
    	for(i=1; i<a[0]+1; i++){
    		a[i]=atoi(argv[i+1]);
    		printf("%d \n", a[i]);
    	}
     
    	for(i=0; i<a[0]; i++){
    		creerPetale(i+1, 1, a[0], a[i+1]);
    		sleep(1);
    	}
    	return 0;
    }

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    Je ne comprends pas pourquoi a[0] est utilisé alors qu'il n'a rien à voir avec le reste du tableau ?

    Le nommage des variables n'aide pas non plus, un peu plus clair comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/wait.h>
    #include <fcntl.h>
    #include <string.h>
    #include <errno.h>
     
     
     
     
    void fils(int nbPetale, int numProc, int nbPetMax, int nbProcMax){
    	int pid;
    	printf("Fils nbPetale:%d numProc:%d nbPetMax:%d nbProcMax:%d\n", nbPetale, numProc, nbPetMax, nbProcMax);
     
    	if(nbProcMax>1){
    		pid=fork();
    		if(pid==0){
    			fils(nbPetale, numProc+1, nbPetMax, nbProcMax-1);
    		}else{
    			wait(0);	
    		}
    	}
     
     
     
    }
     
    void creerPetale(int nbPetale, int numProc, int nbPetMax, int nbProcMax){
    	int i, pid;
     
    	printf("Creer petale nbPetale:%d numProc: %d nbPetMax:%d nbProcMax:%d\n", nbPetale, numProc, nbPetMax, nbProcMax);
     
    	if(nbProcMax>1){
    		pid=fork();
    		if(pid==0){
    			fils(nbPetale, 2, nbPetMax, nbProcMax-1);
    			exit(0);
    		}else{
    			waitpid(pid,0,0);
    		}
    	}
     
    }	
     
    #define MAX_PETALES 25
    int main(int argc, char* argv[]){
    	int petale;
    	int nb_petales;
    	char tube[MAX_PETALES]; // 25 devrait 
    	char tube2[MAX_PETALES];
    	int procs_per_petale[MAX_PETALES];
    	int sortieTube;
     
    	if(argc==1) {
    		fprintf(stderr, "Erreur, usage %s <nb_petales> procs_petale1 procs_petale2 procs_petale3 ...\n",argv[0]);
    		exit(0);	  
    	}
     
    	nb_petales=atoi(argv[1]); // argc devrait être utilisé plutôt?
    	printf("Create %d petales\n", nb_petales);
    	if(nb_petales<=0 || nb_petales>MAX_PETALES){
    		fprintf(stderr, "Erreur, le nombre de pétales doit être compris entre 1 et %d\n",MAX_PETALES);
    		exit(0);
    	}
     
    	for(petale=0; petale<nb_petales; petale++){
    		procs_per_petale[petale]=atoi(argv[petale+2]);
    		printf("Pétales %d, nb_proc %d \n", petale, procs_per_petale[petale]);
    	}
     
    	for(petale=0; petale<nb_petales; petale++){
    		printf("Creer petale %d\n",petale);
    		creerPetale(petale+1, 1, nb_petales, procs_per_petale[petale]);
    		sleep(1);
    	}
    	return 0;
    }

    De ce que je comprends tu vas lancer le programme ainsi : ./petales 4 1 2 3 4

    Et tu attends la sortie :

    Create 4 petales
    Pétales 0, nb_proc 1 
    Pétales 1, nb_proc 2 
    Pétales 2, nb_proc 3 
    Pétales 3, nb_proc 4 
    Creer petale 0
    Creer petale nbPetale:1 numProc: 1 nbPetMax:4 nbProcMax:1
    Creer petale 1
    Creer petale nbPetale:2 numProc: 1 nbPetMax:4 nbProcMax:2
    Fils nbPetale:2 numProc:2 nbPetMax:4 nbProcMax:1
    Creer petale 2
    Creer petale nbPetale:3 numProc: 1 nbPetMax:4 nbProcMax:3
    Fils nbPetale:3 numProc:2 nbPetMax:4 nbProcMax:2
    Fils nbPetale:3 numProc:3 nbPetMax:4 nbProcMax:1
    Creer petale 3
    Creer petale nbPetale:4 numProc: 1 nbPetMax:4 nbProcMax:4
    Fils nbPetale:4 numProc:2 nbPetMax:4 nbProcMax:3
    Fils nbPetale:4 numProc:3 nbPetMax:4 nbProcMax:2
    Fils nbPetale:4 numProc:4 nbPetMax:4 nbProcMax:1
    
    Ce qu'il manquait dans ton code c'était un exit(0); après la terminaison d'un fils.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    Exact ça marche merci! C'était un petit programme de test d'un plus gros prog, donc c'était un peu fait à la va vite donc j'avoue que niveau variable et autre ce n'était pas super clair. Merci encore à toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création multiple de processus javaw.exe - Eclipse
    Par SebastianPx dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 11/08/2009, 09h41
  2. [ZF 1.8] Création d'un processus de Workflow
    Par brunpatoch dans le forum MVC
    Réponses: 4
    Dernier message: 06/05/2009, 16h57
  3. Création de n processus
    Par ould64 dans le forum C
    Réponses: 1
    Dernier message: 01/05/2008, 09h04
  4. Réponses: 2
    Dernier message: 19/03/2008, 23h43
  5. création de plusieurs processus
    Par Paul75 dans le forum Linux
    Réponses: 5
    Dernier message: 29/01/2007, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo