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 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
| #include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <signal.h>
void pere1();
void pere2();
void fils1();
void fils2();
int randomSel();
void verif();
int rand_a_b();
//creation des tubes en lecture et en ecriture - 1 pour chaque equipe
int pip1[2], pip2[2];
char buff[5];
// variables pour la sélection aléatoire des fichiers :
int nb_arrivee=0;
int min = 0000;
int max = 8001;
int main()
{
// les processus (pg1 sous processus pa1.1 a 5 et processus pg2 avec sous processus pa2.1 a 5)
pid_t pg1,pg2, pa11, pa12, pa13, pa14, pa15, pa21, pa22, pa23, pa24, pa25;
// variables pour récupérer nb de points
int w11, w12, w13, w14, w15, w21, w22, w23, w24, w25;
int r11, r12, r13, r14, r15, r21, r22, r23, r24, r25;
// creation du premier processus general - equipe 1
pg1=fork();
if (pg1==0) {
// creation pipe a partager entre pg1 et ses 5 sous processus
// signale erreur si pb à la création d'un pipe
if(pipe(pip1) == -1)
{
perror("Erreur à la création du tube de communication 1.");
exit(-1);
}
// création des 5 sous processus - equipe 1
pa11=fork();
pa12=fork();
pa13=fork();
pa14=fork();
pa15=fork();
//appelle les fonctions selon type de processus
switch(fork())
{
case -1 :
perror("Erreur lors de la création du fils.");
exit(-1);
case 0 :
fils1();
break;
default :
pere1();
break;
}
return(0);
}
//creation du deuxième processus general - equipe 2
pg2=fork();
if (pg2==0) {
// creation pipe a partager entre pg2 et ses 5 sous processus
// signale erreur si pb à la création d'un pipe
if(pipe(pip2) == -1)
{
perror("Erreur à la création du tube de communication 3.");
exit(-1);
}
// création des 5 sous processus - equipe 2
pa21=fork();
pa22=fork();
pa23=fork();
pa24=fork();
pa25=fork();
//appelle les fonctions selon type de processus
switch(fork())
{
case -1 :
perror("Erreur lors de la création du fils.");
exit(-1);
case 0 :
fils2();
break;
default :
pere2();
break;
}
return(0);
exit(0);
}
}// fin main
// equipe 1
void pere1(){
// mise en place du timing
//alarm(20);
//while(20) {
// sélection des fichiers
int i;
for (i=0; i<4; i++) {
rand_a_b(min, max);
char buff2 [4];
// transforme le résultat en string
sprintf(buff2, "%d", nb_arrivee);
// ecriture et transmission des n° de fichiers via un pipe
close(pip1[0]);
printf("[Père :]Ecriture dans le tube de communication 1.\n");
if(write(pip1[1], buff2, 4) > 4)
{
perror("Erreur lors de l'écriture dans le tube de communication 1.");
exit(-1);
}
wait(NULL);
close(pip1[1]);
}
}
void fils1(){
while(1) {
// verifie si il a recut un signal SIG_QUIT
signal(SIGQUIT, verif);
//lit le n° de fichier
int car_lu;
close(pip1[1]);
printf("[Fils :]Attente de lecture\n");
car_lu=read(pip1[0], buff, 4);
printf("[Fils :]Contenu de la lecture : %s\n",buff);
close(pip1[0]);
// ajoute
// ecrit
exit(0);
}}
// equipe 2
void pere2(){
// mise en place du timing
//alarm(20);
//while(20) {
int j;
for (j=0; j<4; j++) {
// sélection des fichiers
rand_a_b(min, max);
char buff2 [4];
sprintf(buff2, "%d", nb_arrivee);
// ecriture et transmission des n° de fichiers via un pipe
close(pip2[0]);
printf("[Père :]Ecriture dans le tube de communication 2.\n");
if(write(pip2[1], buff2, 4) > 4)
{
perror("Erreur lors de l'écriture dans le tube de communication 2.");
exit(-1);
}
wait(NULL);
close(pip2[1]);
}
}
void fils2(){
while(1) {
// verifie si il a recut un signal SIG_QUIT
signal(SIGQUIT, verif);
//lit le n° de fichier
int car_lu;
close(pip2[1]);
printf("[Fils :]Attente de lecture\n");
car_lu=read(pip2[0], buff, 4);
printf("[Fils :]Contenu de la lecture : %s\n",buff);
close(pip2[0]);
exit(0);
}
}
void verif(int num_sig) {
if (num_sig==3) {
printf("je suis le processus %d et je suis mort", getpid());
exit(1);
}
// réarme pour qu'unix ne repositionne pas le traitement par défaut
signal(num_sig, verif);
}
int rand_a_b(int min, int max){
nb_arrivee = rand()%(max-min)+min+1999;
printf("nb d'arrivee %d : nb de depart %d : ", nb_arrivee , nb_arrivee-1999);
return (nb_arrivee);
} |
Partager