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 :

fork multiples et variable globale


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut fork multiples et variable globale
    Bonjour,
    J'ai une question de noob concernant des fork multiples.
    J'essaie de créer un tableau contenant les pids de processus fils créés par des fork(). Dans un premier temps j'essaie de modifier des variables globales depuis les processus père et fils, mais je bloqué déjà à cette étape.
    Voici mon code :

    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
     
    int global1;
    int global2;
     
    int main(int argc, char argv[])
    {
      pid_t pid_fils = -1;
      int i;
      global1 = global2 = 0;
     
      for(i = 0; i <= 3; i++)
        {
          if (pid_fils == 0)
    	{
    	  global2++;
    	  printf("global1 = [%d]\n", global1);
    	  break;
    	}
          else
    	{
    	  pid_fils = fork();
    	  global1++;
    	  printf("global2 = [%d]\n", global2);
    	}
        }
    }
    Et au niveau des traces, je vois que global1 est incrémenté, mais pas global2. Pourriez vous m'éclairer sur ce mécanisme ?

    Merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Bonjour,

    Je ne sais pas ce que tu cherches à faire en particulier, mais lorsque tu utilises fork(), tu crées un niveau processus de toutes pièces. S'il est la copie conforme de son père, il demeure complètement indépendant de celui-ci et dispose de son propre segment de mémoire.

    Il existe donc un exemplaire par processus des variables global1 et global2, fussent-elles globales. Tu ne peux donc pas t'en servir pour communiquer d'un processus à l'autre.

    Si c'est bien ce que tu cherches à faire (et si tu travailles bien sous Unix), vois du côté des segments de mémoire partagée, ou alors tu utilises les pthreads en jetant un œil au TLS.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Bonjour,

    En fait déjà je ne comprends pas pourquoi la variable global1 qui est incrémentée côté processus père est récupérée avec la bonne valeur (et pas égale à 0) côté processus fils. Alors que l'inverse n'est pas vrai.

    Et mon idée de départ était de renseigner les pids des fils dans un tableau global.

    Merci.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Citation Envoyé par fredix_noob Voir le message
    En fait déjà je ne comprends pas pourquoi la variable global1 qui est incrémentée côté processus père est récupérée avec la bonne valeur (et pas égale à 0) côté processus fils. Alors que l'inverse n'est pas vrai.
    Parce que, dans ta boucle, global1 est toujours incrémentée par le père et global2 par un fils. Chaque fils hérite donc d'une copie de global1 du père, telle qu'elle est au moment où le fork() se produit. Il hérite également de global2 de la même façon, mais comme le père n'incrémente jamais cette variable lui-même, chaque fils en reçoit une instance toujours égale à zéro.

    Si tu remplis un tableau de la même façon, chaque fils en héritera d'une copie qui ne contiendra que les PIDs des processus créés avant lui.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Arf oui !

    Merci je vais aller m'amuser avec la mémoire partagée alors

Discussions similaires

  1. fork et variable globale (?)
    Par bulki dans le forum POSIX
    Réponses: 4
    Dernier message: 29/09/2006, 17h50
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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