From c8c59144171598c72db26502318183775a1f3b32 Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Mon, 28 Mar 2011 09:28:14 +0200 Subject: [PATCH] Le producteur quitte si on lui envoie des signaux --- C_Language/TP_SYS/tp_sema/consommateur.c | 4 +- C_Language/TP_SYS/tp_sema/constantes.h | 2 + C_Language/TP_SYS/tp_sema/producteur.c | 52 ++++++++++++++---------- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/C_Language/TP_SYS/tp_sema/consommateur.c b/C_Language/TP_SYS/tp_sema/consommateur.c index cf0fcea..b7a1fdf 100644 --- a/C_Language/TP_SYS/tp_sema/consommateur.c +++ b/C_Language/TP_SYS/tp_sema/consommateur.c @@ -133,7 +133,7 @@ int main( int argc, char **argv) // S'il n'y a plus de producteurs, on quitte if(nbDeProd == 0 && premier_lancement != 0) { - quitter(0); + quitter(PLUSDEPROD); } // Ralentissement volontaire du programme // Pour cause d'utilisation excessive de CPU @@ -173,6 +173,8 @@ void quitter(int signal) if(mutex_tpa >= 0) { del_sem(sem_key_tpa); } endwin() ; + if(signal == PLUSDEPROD) + printf("Plus de producteurs.\n"); printf("FIN.\n"); exit(EXIT_SUCCESS); } diff --git a/C_Language/TP_SYS/tp_sema/constantes.h b/C_Language/TP_SYS/tp_sema/constantes.h index de8d533..69154cf 100644 --- a/C_Language/TP_SYS/tp_sema/constantes.h +++ b/C_Language/TP_SYS/tp_sema/constantes.h @@ -4,3 +4,5 @@ #define MUTEX_DATA 4 // Pour les données #define MAX_PROD 5 // Maximum de producteurs #define MAX_BUF 100 // Taille maximale du buffer + +#define PLUSDEPROD 100 // Plus de producteurs actifs diff --git a/C_Language/TP_SYS/tp_sema/producteur.c b/C_Language/TP_SYS/tp_sema/producteur.c index d3ee8d2..8729f1b 100644 --- a/C_Language/TP_SYS/tp_sema/producteur.c +++ b/C_Language/TP_SYS/tp_sema/producteur.c @@ -7,23 +7,26 @@ #include #include #include +#include #include "constantes.h" #include "types.h" #include "sema.h" #define NAMESIZE 30 +char * nom_de_la_fenetre = NULL; +int mutex_data, mutex_tpa, i=0; +MEMP *memoireP; + +void quitter(int signal); 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, i=0; char c; const char CTRL_D = 4 ; int shmid; int shm_key = atoi(argv[1]); - char * nom_de_la_fenetre = NULL; WINDOW * fenetre ; @@ -32,6 +35,12 @@ int main( int argc, char **argv) shmid = shmget(shm_key, sizeof(MEMP), 0766 | IPC_CREAT); + + // On quitte si on reçoit ces signaux + signal(SIGHUP, quitter); + signal(SIGINT, quitter); + signal(SIGQUIT, quitter); + if (shmid == -1) { perror("shmget"); exit(EXIT_FAILURE); } if((memoireP = (MEMP *) shmat(shmid, 0 , 0766)) ==(void *) -1) { perror("shmat"); exit(EXIT_FAILURE); } @@ -63,30 +72,14 @@ int main( int argc, char **argv) { memoireP->f[memoireP->tete].c = c; memoireP->f[memoireP->tete].idp = i; - //temp.c = (char) c; - //temp.idp = i; - //tete = (int) memoireP->tete; - //memoireP->f[tete] = (MSG) temp; - //tete++; - memoireP->tete++;// = (int) tete; + memoireP->tete++; } 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); - memoireP->tpa[i] = -1; - V(mutex_tpa); - - endwin(); - - // On libère la mémoire de façon propre - free(nom_de_la_fenetre); - - exit(EXIT_SUCCESS); - + quitter(0); } WINDOW *creation_fenetre(int n,int d,char *t) @@ -110,3 +103,20 @@ WINDOW *creation_fenetre(int n,int d,char *t) wrefresh(w) ; return w ; } + +void quitter(int signal) +{ + + endwin(); + // On remet la valeur de l'indice du processus à -1 + // dans le tableau des producteurs + P(mutex_tpa); + memoireP->tpa[i] = -1; + V(mutex_tpa); + + // On libère la mémoire de façon propre + free(nom_de_la_fenetre); + + exit(EXIT_SUCCESS); + +}