[segment de memoire partagée]
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:
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 :)