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
|
#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 shmid;
int *pt; // numero du segment de memoire
void reservationPlaces(int nb)
{
/* shmat(num, (const void *)addr, 0); */
printf("nb places reservees %d \n", places_reservees);
printf("Vous voulez reserver %d place(s)\n", nb);
if(*pt+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;
buf=(struct shmid_ds *)malloc(sizeof(struct shmid_ds));
printf("Voici le nombre de places disponibles actuellement : %d\n", places_max-places_reservees);
// Allouer un segment de memoire partagee
if((shmid = shmget(cle, 128*1024, IPC_EXCL|IPC_CREAT|0666)) == -1)
{
perror("Probleme de creation du segment de memoire\n");
if (shmctl(shmid,IPC_RMID,buf) == -1)
{
perror("Erreur de destruction du segment de memoire\n") ;
}
exit(1);
}
else printf("Segment d'identificateur %d cree\n", shmid);
if((pt=(int *)shmat(shmid,NULL,(int)NULL))== (int *)-1) {
perror("shmat");
exit(1);
}
/* // 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
n = 19;
*pt = n;
reservationPlaces(n);
if(shmdt((const void *)pt)==-1) {
perror("detachement impossible\n");
exit(2);
}
}else { // pere
n = 8;
*pt= n;
reservationPlaces(n);
if(shmdt((const void *)pt)==-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(shmid,IPC_RMID,buf) == -1)
{
perror("Erreur de destruction du segment de memoire\n") ;
exit(5) ;
}
return 0;
} |
Partager