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 :

fork et variable globale (?)


Sujet :

POSIX C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut fork et variable globale (?)
    Salut tout le monde.

    Je me suis lancé dans un petit projet ou j'ai un serveur TCP avec plusieurs clients qui s'y connectent dessus. A chaque fois que j'ai un client, un fork() est créé pour pouvoir en accépter plusieurs. Seulement voilà, j'ai une variable, count_ip qui compte le nombre de connexions (a chaque fois que qqn se connecte, count_ip est incrémenté).
    Voilà ce qu'il se passe:
    -> client 1 se connecte, il obtiens count_ip=1 (son adresse IP)
    -> client 2 se connecte, il obtiens count_ip=2 (son adresse + celle de client 1)
    -> etc

    -> je demande à client 1 de voir combien d'adresse se sont connectées entre temps, j'obtiens toujours pour client 1: count_ip=1, même si 50 clients se sont connectés ultérieurement .

    J'aimerais faire en sorte que cette variable soit "partagée", d'ailleurs j'ai pensé la mettre en static, mais boaf, ça n'aide pas trop.
    Comment est-ce que je pourrais faire pour faire simple ? (en essayant de garder fork, parce que les threads, par encore vu ).

    Merci bcp pour votre aide...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Est-ce que tu peux montrer ton fork() stp?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut
    voilà...

    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
     
     
    #ifndef DEBUG
    	  if(!(child_pid = fork())){
    	       sleep(30);
    	       close(server_sockfd);
    #endif
    	       // read what the client has to say
     
    	       n=read(client_sockfd,&nick,sizeof(nick));
    	       while((n = read(client_sockfd, &buf,sizeof(buf)+1))>0)
     
    	       {
    		    serv_proc((char *)buf, (char *)nick);
    		    bzero(buf, strlen(buf));
    	       }
    	       //close the client
    	       //close (client_sockfd);
    	       printf("\nConnexion closed\n");
    	       exit(0); //end of fork()
    #ifndef DEBUG
    	  }
    #else
    	  close(server_sockfd);
    #endif
     
    	  close(client_sockfd); //parent close the ending sock
         }

    Merci

  4. #4
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Par défaut
    fork() fait une copie de l'image mémoire du processus père dans le processus fils.
    Pour ton client 1, le fork() copie donc la valeur de count_ip qui vaut 1.
    Pour ton client 2, le fork() copie donc la valeur de count_ip qui vaut 2. Mais ne change pas la valeur dans le processus qui gère client 1.

    Je pense que si ton client 2 demande le nombre de connexions il aura toujours 2. Et pour le client n on aura toujours n!

    Il faut donc partager count_ip entre les processus avec les fonctions shmget, shmat, etc.

    Tu n'a pas besoin de faire une exclusion mutuelle (avec semget ...) car seul le processus père modifie count_ip. Les autres processus ne font que la lire.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut
    Citation Envoyé par athoth

    Il faut donc partager count_ip entre le processus avec les fonctions shmget, shmat, etc.

    Tu n'a pas besoin de faire une exclusion mutuelle (avec semget ...) car seul le processus père modifie count_ip. Les autres processus ne font que la lire.
    Merci bcp, je vais essayer ça se soir !
    merci

Discussions similaires

  1. fork multiples et variable globale
    Par fredix_noob dans le forum Débuter
    Réponses: 4
    Dernier message: 23/02/2010, 17h58
  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