#include "polling.h" #define NBMAX 15 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) { //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(3); wait(NULL); } /*Entrée dans primaire*/ else { int pid_primaire; int pid_Secondaire; int pid_trafic; /*Boucle permettant de créer tout les processus secondaire*/ for(i=0;i0); } /*Entrée dans secondaire*/ else { 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 { /*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); } } } } /*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*/ argv_exec[0] = argv[1]; //nom du programme argv_exec[1] = argv[5]; //nb_polling argv_exec[2] = argv[6]; //delai_polling 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); } } }