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

POSIX C Discussion :

Problème de fork en //


Sujet :

POSIX C

  1. #1
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut Problème de fork en //
    Bonsoir\Bonjour tout le monde !!

    Voilà, je cherche à effectuer une liste de processus. Au lancement du programme, celui-ci exécute les 4 premiers processus, puis dés que l'un d'entre eux se termine un autre prend sa place.

    Pour cela j'ai fais une fonction creatProcess :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int createProcess (char* cmd, int indice) {
     
    	if (fork() == 0) {
    		execlp (cmd, cmd, NULL);
    		perror ("Erreur dans l\'exécution de la tache %s\n",cmd);
    		exit(1);
    	}
    	wait (NULL);
    }
    elle est appelé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ind = createProcess (tabCommande[z], z);
    cmd étant la commande à éxécuter et indice, l'indice de la commande qu'on vient d'éxécuter.

    Grosso modo, je vois pas très bien comment lancer d'abord les 4 premiers processus, puis lancer un autre dés que un des 4 premiers est terminé et ainsi de suite...

    Un grand merci à ceux qui pourront m'aider et bonne fin de week end.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour commencer, j'espère que tu es au courant qu'il y a déjà une erreur dans ton code, puisque tu ne retournes rien...

    Pour ton pool de processsus, je te conseille une boucle (potentiellement infinie) et un compteur.
    Tu incrémentes le compteur à chaque processus créé.
    Dès que le compteur atteint 4, tu fais un wait() pour attendre qu'un des fils se termine, puis tu reprends l'exécution de la boucle...
    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 expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    pour moi le wait est mal placé.
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    waitpid() ne sera pas trop utilisable pour une attente multiple.
    Mais en effet, il faut retirer le wait du createProcess(). Désolé de ne pas l'avoir vu plutôt...
    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.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    Salut salut et merci beaucoup pour vos réponses !!

    Suite à ta réponse Médinoc, voilà ce que j'ai fait :

    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
    for (z;z<10;z++){
    		if (z == 4) {
    			wait();
    		}else{
    			createProcess (tabCommande[z]);
    		}
    	}
     
     
    close(descripteur); 
     
    }
     
    void createProcess (char* cmd) {
     
    	if (fork() == 0) {
    		execlp (cmd, cmd, NULL);
    		//perror ("Erreur dans l\'exécution de la tache %s\n",cmd);
    		//exit(1);
    	}
     
    }
    J'ai juste bouclé 10 fois car mon tableau contient seulement 10 commandes à effectué.

    Par contre j'ai dû être fortement maladroit quelque part car mon programme plante, je suis débutant en C et je dois avouer que je ne vois pas trop d'où cela peut provenir.

    Merci encore et très bon dimanche !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu dois utiliser un compteur indépendant pour les processus actifs (un autre compteur que Z)
    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.

  7. #7
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    re,

    Comment ça ? je vois pas trop où mettre mon autre compteur, de plus, crois-tu qu'il faille que ma fonction retourne quelque chose ?

    Encore merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour moi, il faudrait que ta fonction retourne une valeur pour dire si elle a réussi à créer le fils ou non... (si fork a réussi ou non).

    D'ailleurs, tu peux remettre le perror() et le exit(), eux étaient bien placés...
    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.

  9. #9
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    Hola lala, je commence à despérer, j'arrive toujours pas, comment t'aurais codé ça Médinoc, je pense avoir fait ce que tu m'as dit mais mon prog reste toujours bloqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	for (z;z<10;z++){
     
    		if (ind == 4) {
    			wait();
    		}else{
    			ind = createProcess (tabCommande[z],ind);
    		}
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int createProcess (char* cmd, int cpt) {
     
    	if (fork() == 0) {
    		execlp (cmd, cmd, NULL);
    		perror ("Erreur dans l\'exécution de la tache %s\n",cmd);
    		exit(1);
    	}
    	return (cpt);
    }

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il faut vraiment que tu mettes de l'ordre dans tes pensées...
    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
    /* Retourne 0 pour OK, -1 pour échec. */
    int createProcess(char const * cmd)
    {
    	int pidFils = fork();
    	if(pidFils == -1)
    		return -1; /* erreur. */
    	if(pidFils == 0)
    	{
    		/* Fils. */
    		execlp(cmd, cmd, NULL);
    		perror("exec");
    		exit(1);
    	}
    	/* Père. */
    	return 0;
    }
     
    int main(void)
    {
    	char const * const tabCommande[10] = {...};
    	int z;
    	int nbProc = 0;
     
    	for(z=0 ; z<10 ; z++)
    	{	
    		if(nbProc == 4)
    		{
    			wait(NULL);
    			nbProc--;
    		}
     
    		if( createProcess(tabCommande[z]) < 0 )
    		{
    			/* Erreur. */
    		}
    		else
    		{
    			/* OK, processus créé. */
    			nbProc++;
    		}
    	}/* For. */
     
    	/* Et maintenant, on atttend la fin des processus restants. */
    	while( nbProc > 0 )
    	{
    		wait(NULL);
    		nbProc--;
    	}
    	return 0;
    }
    Note: Je n'ai pas testé, je n'ai même pas essayé de compiler. De toute façon, je n'ai pas le contenu de tabCommande.
    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.

  11. #11
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    Formidable, compilation sans problème et processus en // ... merci infiniment en tout cas !

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

Discussions similaires

  1. Problème synchronisation fork()
    Par Nicoclem dans le forum C
    Réponses: 2
    Dernier message: 12/06/2008, 18h34
  2. probléme avec fork()
    Par yous18 dans le forum C
    Réponses: 38
    Dernier message: 08/03/2008, 11h21
  3. problème avec fork et execvp !
    Par julien.cousineau dans le forum Linux
    Réponses: 0
    Dernier message: 07/10/2007, 23h38
  4. Problème de FORK
    Par Luciefer dans le forum Programmation et administration système
    Réponses: 7
    Dernier message: 25/07/2007, 09h50
  5. [Perl]problème avec fork
    Par LE NEINDRE dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 23/09/2005, 15h31

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