Derniers changements... non utilisable

master
Philippe Pittoli 2011-03-24 00:56:31 +01:00
parent 1aa7717033
commit 95002771be
2 changed files with 106 additions and 55 deletions

View File

@ -19,6 +19,11 @@
#include "constantes.h" #include "constantes.h"
WINDOW *creation_fenetre(int n,int d,char *t); WINDOW *creation_fenetre(int n,int d,char *t);
typedef struct prod_s
{
int idp;
WINDOW w;
} PROD;
int main( int argc, char **argv) int main( int argc, char **argv)
{ {
@ -32,11 +37,13 @@ int main( int argc, char **argv)
shm_key = (key_t) atoi(argv[1]); shm_key = (key_t) atoi(argv[1]);
MEMP * memoireP; MEMP * memoireP;
MEMP temp;
MSG msgtemp;
PROD tprod[MAX_PROD];
const char CTRL_D = 4 ; int NB_FENETRES = 1;
WINDOW *f_haut, *f_bas, *f_milieu1, *f_milieu2;
int NB_FENETRES = 4; //WINDOW **tWindow;
WINDOW *f_haut, *f_bas, *f_milieu1, *f_milieu2 ;
WINDOW *w ; WINDOW *w ;
char c ; char c ;
@ -59,18 +66,23 @@ int main( int argc, char **argv)
if((mutex_glob = creat_sem( sem_key_glob, 1)) == -1) if((mutex_glob = creat_sem( sem_key_glob, 1)) == -1)
{ perror("creat_sem"); exit(EXIT_FAILURE); } { perror("creat_sem"); exit(EXIT_FAILURE); }
P(mutex_data); temp.tete = 0;
temp.queue = 0;
memoireP->tete = 0;
memoireP->queue = 0;
for( i = 0; i < MAX_PROD ; i++)
temp.tpa[i] = -1;
P(mutex_data);
*memoireP = temp;
V(mutex_data); V(mutex_data);
P(mutex_tpa); sleep(5);
for( i = 0; i < MAX_PROD ; i++) // nbDeProd => est-ce qu'il y a des producteur (si 0 on quitte)
memoireP->tpa[i] = -1; int nbDeProd;
V(mutex_tpa);
// 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 // Création des fenêtres MARCHE
f_haut = creation_fenetre(LINES/NB_FENETRES,0,"F_HAUT") ; 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_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") ; 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) 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); 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; numTete = vartemp;
c = (char) memoireP->f[numTete].c; c = msgtemp.c;
switch(memoireP->f[numTete].idp) //w = tprod[msgtemp.idp].w;
{ w = f_haut;
case 0 :
w = f_haut;
break;
case 1 :
w = f_milieu1;
break;
case 2 :
w = f_milieu2;
break;
default :
w = f_bas;
}
waddch(w,c) ; waddch(w,c) ;
wrefresh(w) ; wrefresh(w) ;
} }
P(mutex_data);
vartemp = (int) memoireP->queue;
vartemp = (vartemp +1) % MAX_BUF;
memoireP->queue = vartemp;
V(mutex_data); 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 // S'il n'y a plus de producteurs, on quitte
if(aDesProd == 0) if(nbDeProd == 0)
{ {
if(shmctl(shmid, IPC_RMID, 0) < 0) if(shmctl(shmid, IPC_RMID, 0) < 0)
{ perror("shmctl"); exit(EXIT_FAILURE); } { perror("shmctl"); exit(EXIT_FAILURE); }

View File

@ -5,24 +5,37 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/ipc.h> #include <sys/ipc.h>
#include <sys/shm.h> #include <sys/shm.h>
#include <curses.h>
#include <ctype.h>
#include "constantes.h" #include "constantes.h"
#include "types.h" #include "types.h"
#include "sema.h" #include "sema.h"
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; 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; char c;
MSG message; MSG message;
key_t sem_key_data = MUTEX_DATA; const char CTRL_D = 4 ;
key_t sem_key_glob = MUTEX_GLOB;
key_t sem_key_tpa = MUTEX_TPA;
int shmid; int shmid;
int shm_key = atoi(argv[1]); 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); shmid = shmget(shm_key, sizeof(MEMP), 0766 | IPC_CREAT);
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); }
@ -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); } if((sem_global = open_sem( sem_key_glob)) == -1) { perror("open_sem"); exit(EXIT_FAILURE); }
// sem_global est un sémaphore à MAX_PROD entrants. // sem_global est un sémaphore à MAX_PROD entrants.
P(sem_global); //P(sem_global);
P(mutex_tpa); P(mutex_tpa);
for(i = 0; i < MAX_PROD && memoireP->tpa[i] != -1 ; i++); for(i = 0; i < MAX_PROD && memoireP->tpa[i] != -1 ; i++);
V(mutex_tpa); V(mutex_tpa);
@ -39,18 +52,27 @@ int main( int argc, char **argv)
if(memoireP->tpa[i] != -1) { exit(EXIT_FAILURE); } if(memoireP->tpa[i] != -1) { exit(EXIT_FAILURE); }
memoireP->tpa[i] = 0; memoireP->tpa[i] = 0;
// On quitte le producteur en tappant 0 (zéro) fenetre = creation_fenetre(LINES,0,"PRODUCTEUR") ;
while((c = getc(stdin)) != '0')
// On quitte le producteur en tappant CTRL_D
while (( c = wgetch(fenetre)) != CTRL_D)
{ {
P(mutex_data); P(mutex_data);
if(((memoireP->queue -1) % MAX_BUF) != (memoireP->tete % MAX_BUF) ) if(((memoireP->queue -1) % MAX_BUF) != (memoireP->tete % MAX_BUF) )
{ {
memoireP->f[memoireP->tete].c = c; temp = (MSG) memoireP->f[memoireP->tete];
memoireP->f[memoireP->tete].idp = i; temp.c = (char) c;
memoireP->tete = memoireP->tete +1; 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); 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 // On a fini, on remet la valeur de l'indice du processus à -1 dans le tableau des producteurs
P(mutex_tpa); P(mutex_tpa);
@ -58,7 +80,31 @@ int main( int argc, char **argv)
V(mutex_tpa); V(mutex_tpa);
// On a fini, on libère l'accès à un autre producteur // On a fini, on libère l'accès à un autre producteur
V(sem_global); //V(sem_global);
endwin();
return (EXIT_SUCCESS); 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 ;
}