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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
#include "func.c"
#include <stdio.h>
#include <stdlib.h>
#include <sys/signal.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
/*Déclaration des variables pour la mémoire partagée :
nbr_voitures : nombre de voiture
id_mem : identifiant d//Déclaration des sémaphores, un groupe de sémaphore par ressource
*/
int * nbr_voitures, id_mem;
double prix(time_t t1)
{
time_t now;
time(&now);
time_t temps = difftime(now,t1);
if(temps > 3)
{
double temp=((temps-3.0)/4.0);
return temp;
}
else return 0.0;
}
void quit_parking_insatisf()
{
printf("Voiture %d a quitté le parking insatisfait\n", getpid());
(*nbr_voitures)--;
kill(getpid(),SIGKILL);
}
void quit_parking_satisf()
{
printf("Voiture %d a quitté le parking satisfait\n", getpid());
(*nbr_voitures)--;
kill(getpid(),SIGKILL);
}
void stationnement()
{
srand(time(NULL));
float d = (float)rand()/RAND_MAX;
int duree = 1+d*8;
printf("voiture %d stationne pendant %d minutes\n\n", getpid(),duree*15);
sleep(duree);
}
int newsem()
{
int sem;
sem = semget(IPC_PRIVATE, 1, 0660);
initialize(sem,0,3);
return sem;
}
struct ticket
{
int pid;
time_t heure_arrivee;
};
int main(int argc, char **argv)
{
struct ticket str;
int nbr_places, nbr_rangees;
int tube[2];
int voiture, borne_rouge, borne_bleu;
/*Vérification de paramètres entrés au lancement du programme*/
/*Début du programme*/
/*Récupération des paramètres et tests sur ces paramètres*/
nbr_rangees = atoi(argv[1]);
nbr_places = atoi(argv[2]);
//Début du programme parking
//Initialisation du tube
pipe(tube);
/*Création de la mémoire partagée et autorisation d'accès à chaque processus*/
id_mem = shmget(IPC_PRIVATE,sizeof(int),0660);
nbr_voitures=(int*)shmat(id_mem, NULL, SHM_R|SHM_W);
int sem_agent[100];
int places_rangee[100];
int i;
for(i=0;i<nbr_rangees;i++)
{
sem_agent[i]= newsem();
places_rangee[i]=0;
}
void creer_voiture()
{
voiture = fork();
if(voiture==0)//on est dans un processus voiture
{
(*nbr_voitures)++;
close(tube[0]); //fermeture du tube en lecture
signal(SIGALRM,quit_parking_insatisf);
signal(SIGUSR1,quit_parking_satisf);
struct ticket mon_ticket = {getpid(),time(NULL)};
printf("tiket is %d %d\n",mon_ticket.pid,mon_ticket.heure_arrivee);
alarm(3);
while (1)
{
i=0;
for(i=0;i<nbr_rangees;i++)
{
if (places_rangee[i]< nbr_places)
{
printf("nombre de places %d\n",nbr_places);
printf("nombre de voitures %d\n",(*nbr_voitures));
printf("entree dans la rangée %d\n",i);
alarm(0);
places_rangee[i]=places_rangee[i]+1;
down(sem_agent[i],0);
sleep(1);
up(sem_agent[i],0);
stationnement();
down(sem_agent[i],0);
sleep(1);
up(sem_agent[i],0);
places_rangee[i]=places_rangee[i]-1;
write(tube[1],&mon_ticket,sizeof(struct ticket));
close(tube[1]);
while(1){}
}
}
}
}
}
borne_rouge = fork();
if(borne_rouge==0)//on est dans la borne rouge
{
close(tube[1]);//on ferme l'écriture dans le tube
printf("borne rouge cree\n");
while(1)
{
read(tube[0],&str,sizeof(struct ticket)); //on lit le pid du client dans le tube
if( str.pid==0) break; //si id vaut 0, le programme est quitté
double price = prix(str.heure_arrivee);
printf("Voiture %d a payé %f\n", str.pid, price);
kill(str.pid,SIGUSR1); //Voiture peut quitter le parking
}
close(tube[0]);
exit(0);
}
borne_bleu=fork();
if(borne_bleu==0)
{
//Fonction création d'une voiture
printf("parking ouvert!\n");
signal(SIGUSR1,creer_voiture);
}
*nbr_voitures=0;
printf("Tapez enter pour ajouter une voiture, et sur 'q' pour quitter! \n");
while(getchar()!='q')
{
kill(borne_bleu,SIGUSR1);
printf("%d voitures dans le parking\n",*nbr_voitures);
}
printf("fin du programme,attente des dernières voitures \n");
int etat;
while((*nbr_voitures)>0) // fonction pas encore finie,attend toutes les voitures
{
wait(&etat);
}
printf("Plus de voitures,au revoir!\n");
kill(SIGKILL,borne_rouge);
return 0;
} |