diff --git a/C_Language/TP_SYS/tp_sema/consommateur.c b/C_Language/TP_SYS/tp_sema/consommateur.c index 757140f..700074d 100644 --- a/C_Language/TP_SYS/tp_sema/consommateur.c +++ b/C_Language/TP_SYS/tp_sema/consommateur.c @@ -19,6 +19,11 @@ #include "constantes.h" WINDOW *creation_fenetre(int n,int d,char *t); +typedef struct prod_s +{ + int idp; + WINDOW w; +} PROD; int main( int argc, char **argv) { @@ -32,11 +37,13 @@ int main( int argc, char **argv) shm_key = (key_t) atoi(argv[1]); MEMP * memoireP; + MEMP temp; + MSG msgtemp; + PROD tprod[MAX_PROD]; - const char CTRL_D = 4 ; - - int NB_FENETRES = 4; - WINDOW *f_haut, *f_bas, *f_milieu1, *f_milieu2 ; + int NB_FENETRES = 1; + WINDOW *f_haut, *f_bas, *f_milieu1, *f_milieu2; + //WINDOW **tWindow; WINDOW *w ; char c ; @@ -59,18 +66,23 @@ int main( int argc, char **argv) if((mutex_glob = creat_sem( sem_key_glob, 1)) == -1) { perror("creat_sem"); exit(EXIT_FAILURE); } - P(mutex_data); - - memoireP->tete = 0; - memoireP->queue = 0; + temp.tete = 0; + temp.queue = 0; + for( i = 0; i < MAX_PROD ; i++) + temp.tpa[i] = -1; + + P(mutex_data); + *memoireP = temp; V(mutex_data); - P(mutex_tpa); - for( i = 0; i < MAX_PROD ; i++) - memoireP->tpa[i] = -1; - V(mutex_tpa); + sleep(5); + // nbDeProd => est-ce qu'il y a des producteur (si 0 on quitte) + int nbDeProd; + // numTete est un entier qui détermine la "tête" courante. Si elle a changé, c'est qu'on a ajouté un caractère + int numTete = 0; + int vartemp; // Création des fenêtres MARCHE f_haut = creation_fenetre(LINES/NB_FENETRES,0,"F_HAUT") ; @@ -78,47 +90,40 @@ int main( int argc, char **argv) f_milieu2 = creation_fenetre(LINES/NB_FENETRES,LINES - 2 * (LINES/NB_FENETRES),"F_MILIEU2") ; f_bas = creation_fenetre(LINES/NB_FENETRES, LINES - (LINES/NB_FENETRES),"F_BAS") ; - sleep(5); - // aDesProd => est-ce qu'il y a des producteur (si 0 on quitte) - int aDesProd; - - // numTete est un entier qui détermine la "tête" courante. Si elle a changé, c'est qu'on a ajouté un caractère - int numTete = 0; - while (1) { - aDesProd = 0; + // On (re)met nbDeProd à 0 + nbDeProd = 0; + + // On vérifie qu'il y ait toujours des producteurs MARCHE + for(i = 0 ; i < MAX_PROD && nbDeProd == 0 ; i++ ) + if(memoireP->tpa[i] != -1) + nbDeProd++; + P(mutex_data); - if(numTete != memoireP->tete) + vartemp = (int) memoireP->tete; + msgtemp = (MSG) memoireP->f[vartemp]; + V(mutex_data); + + if(numTete != vartemp) { - numTete = memoireP->tete; - c = (char) memoireP->f[numTete].c; - switch(memoireP->f[numTete].idp) - { - case 0 : - w = f_haut; - break; - case 1 : - w = f_milieu1; - break; - case 2 : - w = f_milieu2; - break; - default : - w = f_bas; - } + numTete = vartemp; + c = msgtemp.c; + //w = tprod[msgtemp.idp].w; + w = f_haut; + waddch(w,c) ; wrefresh(w) ; } + + P(mutex_data); + vartemp = (int) memoireP->queue; + vartemp = (vartemp +1) % MAX_BUF; + memoireP->queue = vartemp; V(mutex_data); - // On vérifie qu'il y ait toujours des producteurs MARCHE - for(i = 0 ; i < MAX_PROD && aDesProd == 0 ; i++ ) - if(memoireP->tpa[i] != -1) - aDesProd = 1; - // S'il n'y a plus de producteurs, on quitte - if(aDesProd == 0) + if(nbDeProd == 0) { if(shmctl(shmid, IPC_RMID, 0) < 0) { perror("shmctl"); exit(EXIT_FAILURE); } diff --git a/C_Language/TP_SYS/tp_sema/producteur.c b/C_Language/TP_SYS/tp_sema/producteur.c index f583830..6763285 100644 --- a/C_Language/TP_SYS/tp_sema/producteur.c +++ b/C_Language/TP_SYS/tp_sema/producteur.c @@ -5,24 +5,37 @@ #include #include #include +#include +#include #include "constantes.h" #include "types.h" #include "sema.h" +WINDOW *creation_fenetre(int n,int d,char *t); int main( int argc, char **argv) { if(argc < 2) { printf("Usage %s numIPC\n", argv[0]); exit(EXIT_FAILURE); } MEMP *memoireP; - int mutex_data, mutex_tpa, sem_global, continuer = 0, i=0; + MSG temp; + int mutex_data, mutex_tpa, sem_global, continuer = 0, i=0, tete; char c; MSG message; - key_t sem_key_data = MUTEX_DATA; - key_t sem_key_glob = MUTEX_GLOB; - key_t sem_key_tpa = MUTEX_TPA; + const char CTRL_D = 4 ; int shmid; int shm_key = atoi(argv[1]); + WINDOW * fenetre ; + + initscr() ; /* initialisation (obligatoire) de curses */ + noecho() ; /* suppression de l'echo des caracteres tapes*/ + cbreak() ; /* lecture non bufferisee */ + + key_t sem_key_data = MUTEX_DATA; + key_t sem_key_glob = MUTEX_GLOB; + key_t sem_key_tpa = MUTEX_TPA; + shmid = shmget(shm_key, sizeof(MEMP), 0766 | IPC_CREAT); + if (shmid == -1) { perror("shmget"); exit(EXIT_FAILURE); } if((memoireP = (MEMP *) shmat(shmid, 0 , 0766)) ==(void *) -1) { perror("shmat"); exit(EXIT_FAILURE); } @@ -31,7 +44,7 @@ int main( int argc, char **argv) if((sem_global = open_sem( sem_key_glob)) == -1) { perror("open_sem"); exit(EXIT_FAILURE); } // sem_global est un sémaphore à MAX_PROD entrants. - P(sem_global); + //P(sem_global); P(mutex_tpa); for(i = 0; i < MAX_PROD && memoireP->tpa[i] != -1 ; i++); V(mutex_tpa); @@ -39,18 +52,27 @@ int main( int argc, char **argv) if(memoireP->tpa[i] != -1) { exit(EXIT_FAILURE); } memoireP->tpa[i] = 0; - // On quitte le producteur en tappant 0 (zéro) - while((c = getc(stdin)) != '0') + fenetre = creation_fenetre(LINES,0,"PRODUCTEUR") ; + + // On quitte le producteur en tappant CTRL_D + while (( c = wgetch(fenetre)) != CTRL_D) { + P(mutex_data); if(((memoireP->queue -1) % MAX_BUF) != (memoireP->tete % MAX_BUF) ) { - memoireP->f[memoireP->tete].c = c; - memoireP->f[memoireP->tete].idp = i; - memoireP->tete = memoireP->tete +1; + temp = (MSG) memoireP->f[memoireP->tete]; + temp.c = (char) c; + temp.idp = i; + tete = (int) memoireP->tete; + memoireP->f[tete] = (MSG) temp; + tete++; + memoireP->tete = (int) tete; } - fprintf(stdout, "Voici le caractère écrit : %c\n", memoireP->f[memoireP->tete].c); V(mutex_data); + + waddch(fenetre,c) ; + wrefresh(fenetre) ; } // On a fini, on remet la valeur de l'indice du processus à -1 dans le tableau des producteurs P(mutex_tpa); @@ -58,7 +80,31 @@ int main( int argc, char **argv) V(mutex_tpa); // On a fini, on libère l'accès à un autre producteur - V(sem_global); + //V(sem_global); + + endwin(); return (EXIT_SUCCESS); } + +WINDOW *creation_fenetre(int n,int d,char *t) +{ + WINDOW *cadre ; /* la fenetre pour le cadre */ + WINDOW *w ; /* la fenetre de dialogue */ + + /* creation du cadre */ + + cadre= newwin(n,COLS,d,0) ; + box(cadre,0,0) ; + mvwprintw(cadre,0,COLS/2-strlen(t)/2,t) ; + wrefresh(cadre) ; + + /* creation de la fenetre de dialogue */ + + w= newwin(n-2,COLS-2,d+1,1) ; + idlok(w,TRUE) ; + scrollok(w,TRUE) ; /* mise en place du defilement (scrolling) */ + wclear(w) ; + wrefresh(w) ; + return w ; +}