epmi212
Messages postés2Date d'inscriptionmardi 29 janvier 2008StatutMembreDernière intervention21 juin 2009
-
18 juin 2009 à 22:08
SebLinck
Messages postés212Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention23 juin 2011
-
21 juin 2009 à 18:44
bonjour
je doit rendre le probleme 1 prducteur N consomateurs la semaine prochaine mais j'ai un probleme de code je vois le probleme est ce que vous pouvez m'aider
merci bien
#define TAILLE_FILE_ATTENTE 5 /* Taille de la file d'attente */
/* Déclaration Etat production / consommation */
int etatprod=1; /*1 si en production, 0 sinon */
int etatcons=1; /*1 si en consommation, 0 sinon */
int arretprod=0; /* 1 si on souhaite arreter la production, 0 sinon */
int arretcons=0; /* 1 si on souhaite arreter la consommation, 0 sinon */
/* Déclaration File d'attente */
int nbplalibres=TAILLE_FILE_ATTENTE;
char * file_attente[TAILLE_FILE_ATTENTE];
int positionlecture=0;
int positionecriture=0;
/* Tableau des identifiants des threads */
pthread_t* t_conso;
pthread_t* t_prod;
pthread_t t_supervision;
/* Déclaration des mutex lecture, ecriture , producteurs et consommateurs */
pthread_mutex_t mutex_ecriture = PTHREAD_MUTEX_INITIALIZER;/* mutex permettant d'ecrire dans la file */
pthread_mutex_t mutex_lecture = PTHREAD_MUTEX_INITIALIZER;/* mutex permettant de lire la file */
pthread_mutex_t mutex_case_libre = PTHREAD_MUTEX_INITIALIZER;
/* Fonction gérant les erreurs */
void ctrlArg (int argc, char **argv, int nbArg)
/* controle du nombre d'argument d'un programme */
{
int i;
if (argc!=nbArg+1) /* si le nombre d'argument est incorrect */
{
fprintf(stderr,"Nombre d'arguments incorrect\nUsage : %s",argv[0]);
for(i=1;i<=nbArg;i++)
fprintf(stderr," argument%d",i);
fprintf(stderr,"\n");
exit(1);
}
}
void exitOnErrSyst (char *nomFonction, char *texte)
/* Gestion d'une erreur système */
{
fprintf(stderr,"ERREUR fonction %s - %s",nomFonction,texte);
perror("");
exit(1);
}
/* On attend les ordres du superviseur */
while(1)
{
/* Tant qu'il n'y a pas de production ou si on souhaite arreter la production */
while( (etatprod==0) || (nbplalibres==0) || (arretprod ==1) )
{
if(arretprod==1) /* si on souhaite arreter la production */
{
pthread_exit(NULL);
}
if(etatprod==0) /* si il n'y a pas de production */
{
fprintf(stdout,"\n\nSupervision : producteur %d en sommeil\n",idpro);
if( (pthread_cond_wait(&cond_ecriture,&mutex_ecriture)) != 0)
{
fprintf(stdout,"\n\nAttente producteur");
}
}
}
sleep(1); /* Attende de production : 1sc entre 2 productions */
file_attente[positionecriture]=(char*)malloc(sizeof(char)*(strlen(tampon[r])+1));
if( (pthread_mutex_lock(&mutex_case_libre)) != 0)
{
exitOnErrSyst("pthread_mutex_lock","blocage case libre");
}
nbplalibres--;
if( (pthread_mutex_unlock(&mutex_case_libre)) != 0)
{
exitOnErrSyst("pthread_mutex_unlock","libération case libre");
}
/* si il y a de la place, on ecrit un message dans la file et on récupère le temps*/
r=(r+1)%5;
file_attente[positionecriture]=tampon[r];
t=time(NULL);
date=ctime(&t);
/* Ecriture dans un fichier du message producteur */
fprintf(stdout,"\n\n%s Producteur numéro %d écriture case %d produit %s\n",date,idpro,positionecriture,file_attente[positionecriture]);
positionecriture = (positionecriture+1)%TAILLE_FILE_ATTENTE;
if( (pthread_mutex_unlock(&mutex_ecriture)) != 0)
{
exitOnErrSyst("pthread_mutex_unlock","libération Ecriture file");
}
/* On signale qu'il y a quelque chose à lire dans cette case car la case a été écrite */
if( (pthread_cond_signal(&cond_lecture)) != 0)
{
fprintf(stdout,"\n\nErreur Variable conditionnelle lecture");
exit(1);
}
}
}
int idcons=(int)arg;
/* On attend les ordres du superviseur */
while(1)
{
/* Tant qu'il n'y a pas de consommation ou si on souhaite arreter la consommation */
while( (etatcons==0) || (arretcons ==1) || (nbplalibres==TAILLE_FILE_ATTENTE) )
{
if(arretcons==1) /* si on souhaite arreter la consommation */
{
pthread_exit(NULL);
}
if(etatcons==0) /* si il n'y a pas de consommation */
{
fprintf(stdout,"\n\nSupervision : consommateur %d en sommeil\n",idcons);
if( (pthread_cond_wait(&cond_lecture,&mutex_lecture)) != 0)
{
fprintf(stdout,"\n\nAttente consommateur");
}
}
}
sleep(2); /* Attende de consommation : 2sc entre 2 consommations */
if( (pthread_mutex_lock(&mutex_case_libre)) != 0)
{
exitOnErrSyst("pthread_mutex_lock","blocage case libre");
}
nbplalibres++;
if( (pthread_mutex_unlock(&mutex_case_libre)) != 0)
{
exitOnErrSyst("pthread_mutex_unlock","libération case libre");
}
t=time(NULL);
date=ctime(&t);
/* Ecriture dans un fichier du message consommateur */
fprintf(stdout,"\n\n%s Consommateur numéro %d lecture case %d j'aime %s\n",date,idcons,positionlecture,file_attente[positionlecture]);
free(file_attente[positionlecture]);
positionlecture=(positionlecture + 1)%TAILLE_FILE_ATTENTE;
if( (pthread_mutex_unlock(&mutex_lecture)) != 0)
{
exitOnErrSyst("pthread_mutex_unlock","libération lecture file");
}
/* On signale qu'il y a quelque chose à lire dans cette case car la case a été lue */
if( (pthread_cond_signal(&cond_ecriture)) != 0)
{
fprintf(stdout,"Erreur Variable conditionnelle ecriture");
exit(1);
}
}
}
}
fprintf(terminal,"\n\t*******Reprise Consommation*******\n");
break;
}
case '3' : /*Suspension Production */
{
etatprod=0;
fprintf(terminal,"\n\t*******Production suspendue*******\n");
break;
}
case '4' : /*Reprise Production */
{
etatprod=1;
if( (pthread_cond_broadcast(&cond_ecriture)) != 0)
{
fprintf(stdout,"Erreur reprise producteur");
}
fprintf(terminal,"\n\t*******Reprise production*******\n");
break;
}
case '5' : /*Suspension Consommation & Production */
{
etatprod=0;
etatcons=0;
fprintf(terminal,"\n\t*******Production & Consommation suspendues*******\n");
break;
}
case '6' : /*Arret de l'application */
{
/* premiere etape : envoi de reprise de tous les producteurs */
etatprod=1;
if( (pthread_cond_broadcast(&cond_ecriture)) != 0)
{
fprintf(stdout,"\n\nErreur reprise producteur");
}
/* envoi de reprise de tous les consommateurs */
etatcons=1;
if( (pthread_cond_broadcast(&cond_lecture)) != 0)
{
fprintf(stdout,"\n\nErreur reprise consommateurs");
}
/* envoi du signal de fin des consommateurs et producteurs */
arretprod=1;
arretcons=1;
int fd,i,j,nb[2];
ctrlArg (argc,argv,2);
nbprod=atoi(argv[1]);
nbcons=atoi(argv[2]);
/* nb permet de savoir le nombre de consommateurs et de producteurs pour le thread de supervision */
nb[1]=nbprod;
nb[2]=nbcons;
if( (fd=(open("/dev/tty",O_WRONLY|O_APPEND))) == -1)
{
exitOnErrSyst("open","ouverture terminal");
}
if( (terminal=fdopen(fd,"ab+")) == NULL)
{
exitOnErrSyst("fdopen","ouverture du terminal en écriture");
}
fprintf(terminal,"\n\nVous avez opté pour %d producteurs et %d consommateurs",nb[1],nb[2]);
/* création des identifiants des threads */
t_conso = (pthread_t*)malloc(nbcons*sizeof(pthread_t));
t_prod = (pthread_t*)malloc(nbprod*sizeof(pthread_t));
epmi212
Messages postés2Date d'inscriptionmardi 29 janvier 2008StatutMembreDernière intervention21 juin 2009 21 juin 2009 à 18:13
salut
merci de m'avoir répondu enfin s'intersser à ma question
oféte c que quand je complie j'ai un message d'erreur et je vois pas le probleme!
est ce que c'est possible que vous regarder et essayer de le compiler car moi je vois pas du tout le probleme
merci bien
bien à vous
SebLinck
Messages postés212Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention23 juin 2011 21 juin 2009 à 18:44
Salut,
Copier collé de ton code dans un fichier main.c,
ensuite "make main" dans une console, le programme compile sans probème, pas le moindre avertissement ...