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 :

Probleme creation de processus en c


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 51
    Par défaut Probleme creation de processus en c
    Bonjour,
    je dois faire un programme ou le processus père crée N fils qui devront s'exécuter en parallèle.
    je suis bloqué dans mon code. Quelq'un peut-il m'aider svp ?
    Merci.
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <time.h>
    #include <errno.h>
    #include <sys/wait.h>
    int main(int argc, char* argv[]) {
    		int f;
    		int status=0;
    		struct timespec temps;
     
            pid_t pid;
    	    int j;
    	    int a=atoi(argv[1]);
     
     
    	    temps.tv_sec=0;
    		temps.tv_nsec=50000000;
     
          for(f=0;f<a; f++){
     
           switch(pid=fork()) {
     
                   case -1 : /* Oups !!! fork n'a pas marché !*/
                             perror("fork"); exit(errno);
     
                   case  0 : /*Code du fils*/
     
    				for(j=0; j<10; j++)
    				{
    				printf(" %d \n",j);
    				nanosleep(&temps,NULL);
    				}
    				system("ps -f");
    				printf("Id Fils: %d\n",getpid());
    				return 2;
     
                             break;
     
     
                   default : /* Code du père*/
    				for(f=0;f<a; f++){
    				if ( ( pid=wait(&status) ) == -1)
    					exit(errno);
     
                             printf("Fin du processus père de pid %d.\n", getpid());
    }
           }
     
    }
     
           exit(0);
     
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu dois sortir ta boucle de wait() de la première boucle.

    En fait, je te conseille de faire une fonction creer_processus() qui te permettrait de garder les idées claires pour le procesuss père (parce qu'elle ne retournerait que pour le père):
    Code C : 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
    int creer_processus()
    {
    	int pid;
    	switch(pid=fork())
    	{
    	case -1 : /* Oups !!! fork n'a pas marché !*/
    		perror("fork"); 
    		exit(errno);
     
    	case  0 : /*Code du fils*/
    		{
    			for(j=0; j<10; j++)
    			{
    				printf(" %d \n",j);
    				nanosleep(&temps,NULL);
    			}
    			system("ps -f");
    			printf("Id Fils: %d\n",getpid());
    		}
    		exit(2);
     
     
    	default : /* Code du père*/
    		return pid;
    	}
    }
    Ou encore mieux, si vous avez étudié les pointeurs de fonction:
    Code C : 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
    int creer_processus(int (*code_fils)(intptr_t), intptr_t contexte)
    {
    	int pid;
    	switch(pid=fork())
    	{
    	case -1 : /* Oups !!! fork n'a pas marché !*/
    		perror("fork"); 
    		exit(errno);
     
    	case  0 : /*Code du fils*/
    		{
    			int retFils = code_fils(contexte);
    			exit(retFils);
    		}
     
     
    	default : /* Code du père*/
    		return pid;
    	}
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 51
    Par défaut
    J'ai pas tout a fait compris ta phrase "Tu dois sortir ta boucle de wait() de la première boucle."

    Et la fonction creer_procesus() je dois l'integrer a la place alors ?
    Merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Par défaut
    Ta première boucle "for" doit servir à ton processus Père pour soumettre les N processus fils, et rien d'autre.

    En suite seulement, une fois tes N processus fils démarré, tu dois exécuter une boucle pour attendre la fin de l'exécution de chaque processus fil.
    (sinon, à chaque fois que tu soumet un processus fils, tu attends la fin d'exécution de N processus fils,

    Donc, dans ton traitement du "switch", lorsque la valeur vaut "default:", tu ne dois rien faire, la boucle "for" qui s'y trouve doit être déplacée avant le "exit(0);"

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <time.h>
    #include <errno.h>
    #include <sys/wait.h>
    int main(int argc, char* argv[])
    {
    	int f;
    	int status=0;
    	struct timespec temps;
            pid_t pid;
    	int j;
     
    	int a=atoi (argv[1]);
     
    	temps.tv_sec=0;
    	temps.tv_nsec=50000000;
     
    	for ( f=0 ; (f<a) ; f++)
    	{
     
    		switch ( pid=fork() )
    		{
     
    		case -1 : /* Oups !!! fork n'a pas marché !*/
    			perror ("fork");
    			exit (errno);
     
    		case  0 : /*Code du fils*/
    			for (j=0 ; (j<10) ; j++)
    			{
    				printf (" %d \n",j);
    				nanosleep (&temps,NULL);
    			}
    			system ("ps -f");
    			printf ("Id Fils: %d\n", getpid ());
    			return 2;
     
    			break;
     
    		default : /* Code du père*/
     
    		}
     
    	}
     
    	/* attendre la fin d'execution des fils maintenant */
    	for ( f=0 ; (f<a) ; f++)
    	{
    		if ( ( pid=wait(&status) ) == -1)
    			exit(errno);
    	}
    	printf("Fin du processus père de pid %d.\n", getpid());
     
     
    	exit(0);
    }

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 51
    Par défaut
    Parfait ! c'est se que j'avais trouver apres ca marche merci beaucoup

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

Discussions similaires

  1. [debutant] jeu avec creation de processus et partage memoire
    Par cbv38 dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 01/12/2005, 17h39
  2. probleme creation setup
    Par asiatik91 dans le forum Installation, Déploiement et Sécurité
    Réponses: 5
    Dernier message: 19/11/2005, 21h53
  3. access2000, probleme creation relations de tables
    Par nono_60 dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2005, 22h50
  4. probleme creation projet
    Par choupinet612 dans le forum XMLRAD
    Réponses: 2
    Dernier message: 05/11/2004, 10h11
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

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