Le producteur quitte si on lui envoie des signaux
parent
d69a511d10
commit
c8c5914417
|
@ -133,7 +133,7 @@ int main( int argc, char **argv)
|
||||||
// S'il n'y a plus de producteurs, on quitte
|
// S'il n'y a plus de producteurs, on quitte
|
||||||
if(nbDeProd == 0 && premier_lancement != 0)
|
if(nbDeProd == 0 && premier_lancement != 0)
|
||||||
{
|
{
|
||||||
quitter(0);
|
quitter(PLUSDEPROD);
|
||||||
}
|
}
|
||||||
// Ralentissement volontaire du programme
|
// Ralentissement volontaire du programme
|
||||||
// Pour cause d'utilisation excessive de CPU
|
// Pour cause d'utilisation excessive de CPU
|
||||||
|
@ -173,6 +173,8 @@ void quitter(int signal)
|
||||||
if(mutex_tpa >= 0) { del_sem(sem_key_tpa); }
|
if(mutex_tpa >= 0) { del_sem(sem_key_tpa); }
|
||||||
|
|
||||||
endwin() ;
|
endwin() ;
|
||||||
|
if(signal == PLUSDEPROD)
|
||||||
|
printf("Plus de producteurs.\n");
|
||||||
printf("FIN.\n");
|
printf("FIN.\n");
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,3 +4,5 @@
|
||||||
#define MUTEX_DATA 4 // Pour les données
|
#define MUTEX_DATA 4 // Pour les données
|
||||||
#define MAX_PROD 5 // Maximum de producteurs
|
#define MAX_PROD 5 // Maximum de producteurs
|
||||||
#define MAX_BUF 100 // Taille maximale du buffer
|
#define MAX_BUF 100 // Taille maximale du buffer
|
||||||
|
|
||||||
|
#define PLUSDEPROD 100 // Plus de producteurs actifs
|
||||||
|
|
|
@ -7,23 +7,26 @@
|
||||||
#include <sys/shm.h>
|
#include <sys/shm.h>
|
||||||
#include <curses.h>
|
#include <curses.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <signal.h>
|
||||||
#include "constantes.h"
|
#include "constantes.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "sema.h"
|
#include "sema.h"
|
||||||
|
|
||||||
#define NAMESIZE 30
|
#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);
|
WINDOW *creation_fenetre(int n,int d,char *t);
|
||||||
int main( int argc, char **argv)
|
int main( int argc, char **argv)
|
||||||
{
|
{
|
||||||
if(argc < 2) { printf("Usage %s numIPC\n", argv[0]); exit(EXIT_FAILURE); }
|
if(argc < 2) { printf("Usage %s numIPC\n", argv[0]); exit(EXIT_FAILURE); }
|
||||||
MEMP *memoireP;
|
|
||||||
int mutex_data, mutex_tpa, i=0;
|
|
||||||
char c;
|
char c;
|
||||||
const char CTRL_D = 4 ;
|
const char CTRL_D = 4 ;
|
||||||
int shmid;
|
int shmid;
|
||||||
int shm_key = atoi(argv[1]);
|
int shm_key = atoi(argv[1]);
|
||||||
char * nom_de_la_fenetre = NULL;
|
|
||||||
|
|
||||||
WINDOW * fenetre ;
|
WINDOW * fenetre ;
|
||||||
|
|
||||||
|
@ -32,6 +35,12 @@ int main( int argc, char **argv)
|
||||||
|
|
||||||
shmid = shmget(shm_key, sizeof(MEMP), 0766 | IPC_CREAT);
|
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 (shmid == -1) { perror("shmget"); exit(EXIT_FAILURE); }
|
||||||
|
|
||||||
if((memoireP = (MEMP *) shmat(shmid, 0 , 0766)) ==(void *) -1) { perror("shmat"); 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].c = c;
|
||||||
memoireP->f[memoireP->tete].idp = i;
|
memoireP->f[memoireP->tete].idp = i;
|
||||||
//temp.c = (char) c;
|
memoireP->tete++;
|
||||||
//temp.idp = i;
|
|
||||||
//tete = (int) memoireP->tete;
|
|
||||||
//memoireP->f[tete] = (MSG) temp;
|
|
||||||
//tete++;
|
|
||||||
memoireP->tete++;// = (int) tete;
|
|
||||||
}
|
}
|
||||||
V(mutex_data);
|
V(mutex_data);
|
||||||
|
|
||||||
waddch(fenetre,c) ;
|
waddch(fenetre,c) ;
|
||||||
wrefresh(fenetre) ;
|
wrefresh(fenetre) ;
|
||||||
}
|
}
|
||||||
// On a fini, on remet la valeur de l'indice du processus à -1 dans le tableau des producteurs
|
quitter(0);
|
||||||
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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WINDOW *creation_fenetre(int n,int d,char *t)
|
WINDOW *creation_fenetre(int n,int d,char *t)
|
||||||
|
@ -110,3 +103,20 @@ WINDOW *creation_fenetre(int n,int d,char *t)
|
||||||
wrefresh(w) ;
|
wrefresh(w) ;
|
||||||
return 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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue