Bonsoir,

Je suis en train de créer un segment de memoire pour pouvoir partager une variable entre un processus pere et son fils, et ma variable se duplique... or elle ne devrait pas,

Voici le code associé,

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
107
108
109
110
111
112
113
114
115
116
#include<stdio.h>
#include <sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#define places_max 20
#define cle (key_t) getuid()
int places_reservees=0;
int num; // numero du segment de memoire
 
void reservationPlaces(int nb)
{
  shmat(num, 0, 0);
  printf("Vous voulez reserver %d place(s)\n", nb);
  if(places_reservees+nb<=places_max)
    {
      places_reservees+=nb;
      printf("La reservation a ete faite.\n");
    }
  else
    {
      printf("La reservation ne peut pas se faire car on depasse le nombre maximum de places.\n");
    }
}
 
int main()
{
  int n;                // variable qui contient le nombre de places qu'un processus veut reserver
  int pid;              // valeur de retour de la primitive fork
  int i, *pint;
  int addr1, addr2;
  struct shmid_ds *buf;
 
  printf("Voici le nombre de places disponibles actuellement : %d\n", places_max-places_reservees); 
 
  // Allouer un segment de memoire partagee
  if((num = shmget(cle, 128*1024, IPC_EXCL|IPC_CREAT|0666)) == -1)
    {
      perror("Probleme de creation du segment de memoire\n");
      exit(1);
    }
  else printf("Segment d'identificateur %d cree\n", num);
 
  // Controler la memoire partage
  if(shmctl(num,IPC_STAT,buf)==-1)
    {
      perror("Probleme lors du controle du segment de memoire\n");
      exit(2);
    }
 
  // Creation du processus fils
  pid = fork();
 
  if(pid < 0)  // pb
    {
      perror("Pb de creation du fils\n");
      exit(1);
    }
  if(pid == 0) // fils
    {
      addr1 = (int*)shmat(num, 0, 0);
 
      if (&addr1 == -1)
	{
	  perror("attachement impossible\n");
	  exit(1);
	}
 
      n = 19;
      num = n;
      reservationPlaces(n);
 
      if(shmdt((int)(const void *)addr1==-1))
	{
	  perror("detachement impossible\n");
	  exit(2);
	}
 
 
    }
  else         // pere
    {
      addr2 = (int*)shmat(num, 0, 0);
 
      if (&addr2 == -1)
	{
	  perror("attachement impossible\n");
	  exit(3) ;
	}
 
      n = 8;
      num = n;
      reservationPlaces(n);
 
      if(shmdt((int)(const void *)addr2)==-1)
	{
	  perror("detachement impossible\n");
	  exit(4) ;
	}
 
 
    }
 
  // attendre la fin des processus
  while(wait(NULL)!=-1);
 
  printf("Voici le nombre de places disponibles actuellement : %d\n", places_max-places_reservees); 
  exit(0);
 
 if (shmctl(num,IPC_RMID,buf) == -1)
   {
     perror("Erreur de destruction du segment de memoire\n") ;
     exit(5) ;
   }
 
  return 0;
}
Merci de voir ce que vous pouvez faire,

Ninie