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 :

Multiple fork() en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 17
    Par défaut Multiple fork() en C
    Bonjour,

    j'écris ici pour solliciter votre aide, je vais résumer mon problème :

    je veux créer n processus fils pour exécuter en parallèle la fonction child_procedure() à chacun des processus fils.
    Mais on me demande de lancer que p processus d'abord (p < n), puis dès qu'un processus s’arrête je relance un nouveau, jusqu'à ce que les n soient lancés.

    Donc mon code ressemble à ç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
    while(i < p)
    {
       pid = fork();
       if(pid == 0)
     
        break;
     
      else if( pid = =-1)
      exit(1);
     
    }
    if(pid >0)
    {
    while(1){
     if(wait(&status) != -1)
     {
        j++;
        if(j== n) break;
        pid0 = fork()
        if(pid0 == 0)
        {
           child_procedure()
     
          }
     
        }
       else break;
    }
     
    }
     
    else child_procedure();
    Mais ça ne marche pas, j'ai mis ici un résume de mon code, j'ai l'impression que quand un fils s’arrête je crée mal le nouveau fils ou bien il n’exécute pas correctement la tache, en tout cas mon programme plante.

    Bref, je suis débutant, et si quelqu'un a une idée ingénieuse ou bien du code C écrit déjà, je suis preneur.

    Cordialement

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonsoir.



    Tes variables i et j représentent quoi ?
    Avec quelles valeurs sont-elles intialisées ?
    C'est normal que i ne soit jamais modifiée ?

  3. #3
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Je peux te proposer un algo en pseudo-code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    p_total = 0
    p_simult = 0
     
    TANT QUE p_total < n FAIRE
        SI p_simult < p ALORS
            nouveau_processus()
            ++p_simult
            ++p_total
        SINON
            attendre()
            --p_simult
        FIN SI
    FIN TANT QUE
    Au fait, c'est un exercice ?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 17
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Je peux te proposer un algo en pseudo-code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    p_total = 0
    p_simult = 0
     
    TANT QUE p_total < n FAIRE
        SI p_simult < p ALORS
            nouveau_processus()
            ++p_simult
            ++p_total
        SINON
            attendre()
            --p_simult
        FIN SI
    FIN TANT QUE
    Au fait, c'est un exercice ?
    Non, c'est un projet.

    ce qui me dérange dans ta solution c'est que les fils ne vont pas s'executer en parallèle.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 17
    Par défaut
    J'ai adapté ta solution à mon code, mais j'ai toujours l'impression que ça ne marche pas :

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Comme cela t'a été demandé plus haut, poste ton code avec la balise CODE prévue à cette effet. C'est illisible.

    En outre, ton code n'est pas du C mais du C++.

Discussions similaires

  1. Réponses: 87
    Dernier message: 06/07/2011, 15h33
  2. fork multiples et variable globale
    Par fredix_noob dans le forum Débuter
    Réponses: 4
    Dernier message: 23/02/2010, 17h58
  3. Création multiple table paradox dans le code
    Par scarabee dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/10/2002, 10h17
  4. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 12h15
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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