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
|
#include "sema.h"
#include <stdio.h>
#include <stdlib.h>
#define NB_VOITMAX 3
#define NB_SEM 4
int Random (int _iMin, int _iMax)
{
return (_iMin + (rand () % (_iMax-_iMin+1)));
}
void traversee1(int *tabSem,int i) //Le véhicule i tourne à droite
{
printf("Le vehicule provenant de %d ",i);
printf("est engage dans le quadrant %d \n",i);
sleep(Random(1,10));
P(tabSem[i]);
printf("Le vehicule provenant de %d a termine de tourner et poursuit sa route \n",i);
exit(0);
}
void traversee2(int *tabSem,int i, int j) //Le véhicule va tout droit de i à j
{
printf("Le vehicule provenant de %d ",i);
printf("est engage dans le quadrant %d \n",i);
sleep(5);
P(tabSem[i]);
printf("Le vehicule provenant de %d ",i);
printf("quitte le quadrant %d \n",i);
sleep(2);
if (fork()==0)
{
V(tabSem[j]);
printf("Le vehicule provenant de %d ",i);
printf("est engage dans le quadrant %d \n",j);
sleep(4);
P(tabSem[j]);
printf("Le vehicule provenant de %d a termine de tourner et poursuit sa route \n",i);
}
exit(0);
}
void traversee3(int *tabSem,int i, int j, int k) //Le véhicule tourne à gauche en respectant la priorité
{
printf("Le vehicule provenant de %d ",i);
printf(" est engage dans le quadrant %d \n",i);
sleep(Random(1,2));
printf("Le vehicule provenant de %d ",i);
printf("quitte le quadrant %d \n",i);
P(tabSem[i]);
if (fork()==0)
{
V(tabSem[j]);
printf("Le vehicule provenant de %d ",i);
printf(" est engage dans le quadrant %d \n",j);
sleep(Random(1,5));
P(tabSem[j]);
printf("Le vehicule provenant de %d ",i);
printf(" quitte le quadrant %d \n",j);
if (fork()==0)
{
V(tabSem[k]);
printf("Le vehicule provenant de %d ",i);
printf("est engage dans le quadrant %d \n",k);
sleep(Random(1,5));
P(tabSem[k]);
printf("Le vehicule provenant de %d a termine de tourner et poursuit sa route \n",i);
}
}
exit(0);
}
void creervoiture(int t)
{
if (fork()==0)
{
V(tabSem[t]);
printf("Un vehicule arrive et s engage dans le quadrant %d)\n",t);
exit(0);
}
}
int main(void)
{
int m,i,j,n;
int nbvoitc; //Nb voiture se présentant au carrefour
srand(time(NULL));
int tabSem[NB_SEM];
printf("Debut programme \n");
for (m=0;m<NB_SEM;m++)
{
tabSem[m]=sem_create(0);
}
if (fork()==0)
{
nbvoitc=Random(1,NB_VOITMAX);
int tabvoit[nbvoitc];
for (j=0;j<nbvoitc;j++)
{
tabvoit[j]=Random(0,NB_VOITMAX);
creervoiture(tabvoit[j]);
}
printf("Total de voitures dans le carrefour %d \n",nbvoitc);
for (n=0;n<nbvoitc;n++)
{
int y;
printf("Voiture %d selectionnee",tabvoit[n]);
switch(Random(1,3))
{
case 1:
traversee1(tabSem, tabvoit[n]);
break;
case 2:
traversee2(tabSem, tabvoit[n],tabvoit[n]+1);
break;
case 3:
if (tabvoit[n]>1)
{
y=0;
}
else
{
y=(tabvoit[n]+2);
}
traversee3(tabSem, tabvoit[n],tabvoit[n]+1,y);
break;
}
}
}
exit(0);
} |
Partager