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
|
#include <string.h>
#define NBMAX 15
void poll_config(char **argv)
{
//Affichage du poll_config
printf("%s\n", argv[0]);
printf("primaire : %s\n", argv[1]);
printf("secondaire : %s\n", argv[2]);
printf("trafic : %s\n", argv[3]);
printf("n : %s\n",argv[4]);
printf("nb_polling : %s\n",argv[5]);
printf("delai_polling : %s\n",argv[6]);
printf("delai_min_requete : %s\n",argv[7]);
printf("delai_max_requete : %s\n\n",argv[8]);
sleep(2);
wait(NULL);
}
void trafic (char **argv, int argc, char * string_pid_Sti, char *string_i, int i)
{
/*Transformation du pid du pere de trafic (secondaire i) en chaine de caractere pour pouvoir l'utiliser dans exec*/
sprintf(string_pid_Sti, "%d",getppid());
/*Choix du exec prenant les parametres en liste et non en tableau car le nombre d'arguments est invariable*/
/*Remplacement du processus courant par celui du trafic et verification du bon déroulement*/
if(execl(argv[3],argv[3],string_i,string_pid_Sti,argv[7],argv[8],NULL) == -1)
{
fprintf(stderr,"erreur lors du exec du trafic de %d", i+1);
exit(EXIT_FAILURE);
}
}
void secondaire (char **argv, int argc, int *pid_trafic, char * string_pid_Sti, char *string_i, int i)
{
*pid_trafic = fork();
/*Vérification du bon déroulement de secondaire i pour créer son trafic*/
if(*pid_trafic==-1)
{
fprintf(stderr, "erreur lors du fork du secondaire %d", i+1);
exit(EXIT_FAILURE);
}
/*Entrée dans secondaire*/
else if(*pid_trafic!=0)
{
/*Transformation du pid de secondaire i en chaine de caractere pour pouvoir l'utiliser dans exec*/
sprintf(string_pid_Sti, "%d",getppid());
/*Le processus secondaire attend la fin de son trafic*/
wait(NULL);
/*Remplacement du processus courant par celui du secondaire et verification du bon déroulement*/
if (execl(argv[2],argv[2],string_i,string_pid_Sti,NULL) == -1)
{
fprintf(stderr,"erreur lors du exec du secondaire %d",i+1);
exit(EXIT_FAILURE);
}
}
/*Entrée dans trafic associé au secondaire précédent*/
else
{
trafic(argv, argc, string_pid_Sti, string_i, i);
}
}
void primaire (char **argv, int argc, int n)
{
char string_i[NBMAX];
char string_pid_Sti[NBMAX];
char string_pid_sti[NBMAX];
int i, j;
int pid_primaire;
int pid_Secondaire;
int pid_trafic;
int pid_Sti[n];
/*Boucle permettant de créer tout les processus secondaire*/
for(i=0;i<n;i++)
{
pid_Secondaire = fork();
sprintf(string_i,"%d",i+1);
/*Vérification du bon déroulement du fork de primaire pour créer le secondaire i*/
if(pid_Sti[i]<0)
{
fprintf(stderr, "erreur lors du fork du primaire pour créer le secondaire %d",i+1 );
exit(EXIT_FAILURE);
}
/*Entrée dans primaire*/
else if(pid_Secondaire!=0)
{
pid_Sti[i]= pid_Secondaire;
int status, wpid;
//Pour que le primaire attend tous les secondaires
while((wpid = wait(&status))>0);
}
/*Entrée dans secondaire*/
else
{
secondaire (argv, argc, &pid_trafic, string_pid_Sti, string_i, i);
}
}
/*Creation d'un tablau de pointeurs sur chaine de caracteres pour pouvoir stocker les arguments necessaires a l'execution du code de primaire*/
/*allocation d'espace necessaire pour stocker les chaines*/
char **argv_exec;
argv_exec = (char**)malloc(10 * sizeof(char*));
/*allocation de chaque case du tableau qui va contenir les chaines de caracteres*/
for(i=0;i<4+n;i++)
/*4+n c'est le nombre de case maximum dont on aura besoin pour stocker les differents éléments dans le tableau, 4 pour les 4 suivant et n pour le nombre de pid_Sti*/
argv_exec[i]= (char*)malloc(10*sizeof(char));
/*Recuperation des arguments passés dans poll_config et necessaires a l'execution de primaire*/
strcpy(argv_exec[0],argv[1]); //nom du programme
strcpy(argv_exec[1],argv[5]); //nb_polling
strcpy(argv_exec[2],argv[6]); //delai_polling
strcpy(argv_exec[3],argv[4]); //n
/*Utilisation d'une boucle for car le nombre de stations secondaires peut varier de 1 a 5 pour stocker les pid de tout les secondaires*/
for (j = 0; j < n; j++)
{
sprintf(argv_exec[(4+j)],"%d",pid_Sti[j]);
}
/*Pour inserer un cran d'arrêt dans le tableau que l'on va faire passer en parametre dans le execv*/
argv_exec[n+4]=NULL;
/*Choix du exec prenant les parametres en tableaux et non en liste car le nombre d'arguments peut varier*/
/*Remplacement du processus courant par celui du trafic et verification du bon déroulement*/
if (execv(argv_exec[0],argv_exec) == -1)
{
perror("erreur lors du exec du primaire");
exit(EXIT_FAILURE);
}
}
int main (int argc, char *argv[])
{
system("clear");
/*Verification du nombre d'argument passé en paramètre*/
if(argc<9 || argc>10)
{
fprintf(stderr,"Usage : %s primaire secondaire trafic n nb_polling delai_polling delai_min_requette delai_max_requette [prefixe_fichier]\n", argv[0]);
exit(EXIT_FAILURE);
}
int n = atoi(argv[4]);
int pid_Sti[n];
/*Nombre de processus que peut créer le primaire*/
if (n<1 || n>5)
{
fprintf(stderr,"Erreur : n (nombre de stations) doit etre compris entre 1 et 5\n");
exit(EXIT_FAILURE);
}
char string_i[NBMAX];
char string_pid_Sti[NBMAX];
char string_pid_sti[NBMAX];
int i, j;
/*Création du processus primaire*/
int pid_primaire = fork();
/*Vérification du bon déroulement du fork de primaire*/
if(pid_primaire<0)
{
perror("erreur lors du fork pour le primaire");
exit(EXIT_FAILURE);
}
/*Entrée dans poll_config*/
else if(pid_primaire>0)
{
poll_config(argv);
}
/*Entrée dans primaire*/
else
{
primaire (argv, argc, n);
}
} |
Partager