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 avec memoire partage


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut Probleme avec memoire partage
    Bonjour ,

    Le main voit les nombres entre dans la memoire partagée mais le processus fils voit 0 ,0 ,0 ... Pourtt c un programme tout simple :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    #include <sys/types.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <signal.h>
    #include <errno.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/select.h>
    #include <sys/sem.h>
    #include <pthread.h>
    #include <sys/shm.h>
     
     
     
    typedef struct{
    	int horloge;
    	int temps_client;
    	int nbre_client_attente;
    	}mem_partage;
     
     
    int mem_id;
     
    int findejournee(); 
     
    void processusaccueil();
     
    int main(int argc, char* argv[])
     
    {
     
    	mem_partage *memoire;
     
    	if ((mem_id = shmget(0,sizeof(mem_partage),IPC_CREAT|IPC_EXCL|0666)) == -1){
    		perror("erreur lors de la creation du segment");
    		exit(1);
    	}
     
    	if ((memoire = shmat(mem_id,0,0)) ==(mem_partage*) -1){
    		perror("attachement memoire partage main");
    		exit(1);
    	}
     
    	memoire =malloc(sizeof (mem_partage));
     
    	memoire->horloge = 66;
    	memoire->nbre_client_attente = 90;
    	memoire->temps_client = 20;
     
     
    	printf("main voit %d a l horloge\n",memoire->horloge);
    	printf("main voit %d a nbre_client_attente\n",memoire->nbre_client_attente);
    	printf("main voit %d a temps client\n",memoire->temps_client);
     
      	printf("Bienvenue au garage !!!\n");
     
     
    	switch(pid_fils = fork())
     
        	{
     
    		case -1 :
    			{
     
          			printf("erreur lors du fork");
    			exit(1);
     
          			break;
    			}
     
        		case  0 :
    			{
     
          			processusaccueil();
     
          			break;
    			}
    	    	}
     
    	exit(EXIT_SUCCESS);
     
    }
     
     
     
     
    void processusaccueil()
     
    {
    	mem_partage* memoire;
     
    	if ((memoire = shmat(mem_id,0,0)) ==(mem_partage*) -1){
    		perror("attachement memoire partage acceuil");
    		exit(1);
    	}
     
    	printf("accueil voit %d a l horloge\n",memoire->horloge);
    	printf("accueil voit %d a nbre_client_attente\n",memoire->nbre_client_attente);
    	printf("accueil voit %d a temps client\n",memoire->temps_client);
    }

  2. #2
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    J ai trou ve une solution mais je pense qu elle n est pas correct :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    #include <sys/types.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <signal.h>
    #include <errno.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/select.h>
    #include <sys/sem.h>
    #include <pthread.h>
    #include <sys/shm.h>
     
     
     
    typedef struct{
    	int horloge;
    	int temps_client;
    	int nbre_client_attente;
    	}mem_partage;
     
     
    int mem_id;
     
    int findejournee(); 
     
    void processusaccueil();
     
    int main(int argc, char* argv[])
     
    {
    	mem_partage *etat;
    	mem_partage *memoire;
     
    	if ((mem_id = shmget(0,sizeof(mem_partage),IPC_CREAT|IPC_EXCL|0666)) == -1){
    		perror("erreur lors de la creation du segment");
    		exit(1);
    	}
     
    	if ((etat= shmat(mem_id,0,0)) ==(mem_partage*) -1){
    		perror("attachement memoire partage main");
    		exit(1);
    	}
     
    	memoire =malloc(sizeof (mem_partage));
     
    	memoire->horloge = 66;
    	memoire->nbre_client_attente = 90;
    	memoire->temps_client = 20;
     
    	*etat = *memoire;
     
    	printf("main voit %d a l horloge\n",memoire->horloge);
    	printf("main voit %d a nbre_client_attente\n",memoire->nbre_client_attente);
    	printf("main voit %d a temps client\n",memoire->temps_client);
     
      	printf("Bienvenue au garage !!!\n");
     
     
    	switch(pid_fils = fork())
     
        	{
     
    		case -1 :
    			{
     
          			printf("erreur lors du fork");
    			exit(1);
     
          			break;
    			}
     
        		case  0 :
    			{
     
          			processusaccueil();
     
          			break;
    			}
    	    	}
     
    	exit(EXIT_SUCCESS);
     
    }
     
     
     
     
    void processusaccueil()
     
    {
    	mem_partage* memoire;
     
    	if ((memoire = shmat(mem_id,0,0)) ==(mem_partage*) -1){
    		perror("attachement memoire partage acceuil");
    		exit(1);
    	}
     
    	printf("accueil voit %d a l horloge\n",memoire->horloge);
    	printf("accueil voit %d a nbre_client_attente\n",memoire->nbre_client_attente);
    	printf("accueil voit %d a temps client\n",memoire->temps_client);
    }

  3. #3
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Pourquoi tu passes par une variable externe pour initialiser ta mémoire partagée au lieu de l'initialiser directement ?

    De plus, tu quittes le processus principal directement après ton fork, ceci peut poser sur certaines machines des problèmes. le mieux, c'est d'utiliser un wait bloquant pour ne pas quitter le fils trop tot.

    Pourquoi tu utilises exit(1) au lieu d'exit(EXIT_FAILURE) ?

  4. #4
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    C'est normal que ça ne marche pas
    Relis ces 2 lignes de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    	memoire = shmat(mem_id,0,0)) ;
    	memoire =malloc(sizeof (mem_partage));
    Tu écrases tout de suite l'adresse de la zone de mémoire partagée par celle, locale, rendue par le malloc()...

Discussions similaires

  1. probleme liberation memoire avec JTextArea
    Par iutcien dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 12/12/2006, 14h06
  2. Problemes de memoires avec les tableaux: outOfMemoryError
    Par Battosaiii dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2006, 17h50
  3. probleme avec la memoire
    Par piff62 dans le forum C
    Réponses: 6
    Dernier message: 25/10/2005, 17h46
  4. probleme avec les allocations memoires
    Par david35 dans le forum C
    Réponses: 5
    Dernier message: 21/10/2005, 12h49
  5. [apache] probleme avec le partage de connexion internet
    Par Delphy113 dans le forum Apache
    Réponses: 9
    Dernier message: 23/06/2005, 12h49

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