On quitte proprement le consommateur si la clef de shm existe déjà
parent
25478031e3
commit
630a0f3e8d
|
@ -49,21 +49,28 @@ int main( int argc, char **argv)
|
||||||
signal(SIGINT, quitter);
|
signal(SIGINT, quitter);
|
||||||
signal(SIGQUIT, 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)
|
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)
|
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)
|
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)
|
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.tete = 0;
|
||||||
temp.queue = 0;
|
temp.queue = 0;
|
||||||
|
@ -87,6 +94,10 @@ int main( int argc, char **argv)
|
||||||
// Si != 0 et si nbDeProd = 0 alors on quitte
|
// Si != 0 et si nbDeProd = 0 alors on quitte
|
||||||
int premier_lancement = 0;
|
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++)
|
for( i = 0; i < MAX_PROD; i++)
|
||||||
{
|
{
|
||||||
tWindow[i] = creation_fenetre(LINES / MAX_PROD, i*(LINES/MAX_PROD), "En attente");
|
tWindow[i] = creation_fenetre(LINES / MAX_PROD, i*(LINES/MAX_PROD), "En attente");
|
||||||
|
|
|
@ -49,7 +49,13 @@ int main( int argc, char **argv)
|
||||||
|
|
||||||
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++);
|
||||||
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;
|
memoireP->tpa[i] = 0;
|
||||||
V(mutex_tpa);
|
V(mutex_tpa);
|
||||||
|
|
||||||
|
@ -68,7 +74,7 @@ int main( int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
P(mutex_data);
|
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].c = c;
|
||||||
memoireP->f[memoireP->tete].idp = i;
|
memoireP->f[memoireP->tete].idp = i;
|
||||||
|
|
|
@ -9,4 +9,6 @@ Faire marcher le programme :
|
||||||
Le consommateur peut se terminer avec un CTRL_C.
|
Le consommateur peut se terminer avec un CTRL_C.
|
||||||
Idem pour le producteur, qui peut également quitter avec un CTRL_D.
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue