On quitte proprement le consommateur si la clef de shm existe déjà

master
Philippe Pittoli 2011-03-28 09:55:25 +02:00
parent 25478031e3
commit 630a0f3e8d
3 changed files with 30 additions and 11 deletions

View File

@ -49,21 +49,28 @@ int main( int argc, char **argv)
signal(SIGINT, quitter);
signal(SIGQUIT, quitter);
initscr() ; /* initialisation (obligatoire) de curses */
noecho() ; /* suppression de l'echo des caracteres tapes*/
cbreak() ; /* lecture non bufferisee */
if((shmid = shmget(shm_key, sizeof(MEMP), IPC_CREAT|IPC_EXCL|0766)) == -1)
{ perror("shmget"); exit(EXIT_FAILURE);}
{
perror("shmget");
exit(EXIT_FAILURE);
}
if((memoireP = (MEMP *) shmat(shmid, 0 , 0766)) == (void *) -1)
{ perror("shmat"); exit(EXIT_FAILURE); }
{
perror("shmat");
exit(EXIT_FAILURE);
}
if((mutex_data = creat_sem( sem_key_data, 1)) == -1)
{ perror("creat_sem"); exit(EXIT_FAILURE); }
{
perror("creat_sem"); exit(EXIT_FAILURE);
}
if((mutex_tpa = creat_sem( sem_key_tpa, 1)) == -1)
{ perror("creat_sem"); exit(EXIT_FAILURE); }
{
perror("creat_sem");
exit(EXIT_FAILURE);
}
temp.tete = 0;
temp.queue = 0;
@ -87,6 +94,10 @@ int main( int argc, char **argv)
// Si != 0 et si nbDeProd = 0 alors on quitte
int premier_lancement = 0;
initscr() ; /* initialisation (obligatoire) de curses */
noecho() ; /* suppression de l'echo des caracteres tapes*/
cbreak() ; /* lecture non bufferisee */
for( i = 0; i < MAX_PROD; i++)
{
tWindow[i] = creation_fenetre(LINES / MAX_PROD, i*(LINES/MAX_PROD), "En attente");

View File

@ -49,7 +49,13 @@ int main( int argc, char **argv)
P(mutex_tpa);
for(i = 0; i < MAX_PROD && memoireP->tpa[i] != -1 ; i++);
if(memoireP->tpa[i] != -1) { V(mutex_tpa); exit(EXIT_FAILURE); }
// Si on n'a plus de place dans le TPA (tous pris) alors on quitte
if(memoireP->tpa[i] != -1)
{
V(mutex_tpa);
printf("Plus de place dispo dans les producteurs");
exit(EXIT_FAILURE);
}
memoireP->tpa[i] = 0;
V(mutex_tpa);
@ -68,7 +74,7 @@ int main( int argc, char **argv)
{
P(mutex_data);
if(((memoireP->queue -1) % MAX_BUF) != (memoireP->tete % MAX_BUF) )
if(((memoireP->queue -1 + MAX_BUF) % MAX_BUF) != (memoireP->tete % MAX_BUF) )
{
memoireP->f[memoireP->tete].c = c;
memoireP->f[memoireP->tete].idp = i;

View File

@ -9,4 +9,6 @@ Faire marcher le programme :
Le consommateur peut se terminer avec un CTRL_C.
Idem pour le producteur, qui peut également quitter avec un CTRL_D.
Le consommateur est programmé pour quitter si tous les producteurs partent.
Le consommateur est programmé pour quitter si les producteurs actifs partent.