Accueil > > > PRODUCER CONSUMER C (WITHIN LINUX)
PRODUCER CONSUMER C (WITHIN LINUX)
Information sur la source
Description
/************************************************* ********************** But : résoudre le problème de Producteurs/consommateurs Description : Ce programme lance (crée) un nombre de producteurs qui écirvent dans un tampon de taille N et lance un autre nombre de consommateurs qui consomme les objets résidant dans le tampon... Cet exemple est sans animation.... *********************************** ************************************/ visit me at : www.begueradj.com Billal Begueradj. University of Bejaia
Source
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <wait.h>
-
- #include <sys/ipc.h> // la bibliothèque des ipc : IPC_CREAT, IPC_EXCL, ...
- #include <sys/sem.h> // La bibliothèque des sémaphores...
- #include <sys/shm.h> // La bibliothèque de la mémoire partgeé...
-
- #include "ccrt.h"
-
- #define Max 10// le nombre maximal de cases dans le tampon...
-
- // les structures t_case et t_info
- typedef struct {// cette structure représente le contenue d'une case d'un tampon (contenant N cases)...
- int nb_rand;
- char ch_rand;
- } t_case;
-
- typedef struct {
- int i,j; // i: indice de la case où sera la production. j: indice de la case où sera la consommation.
- int plein;// nombre indiquant le nombre de cases pleines...
- } t_info;
-
- //les prototypes des fonctions..
- void producteur(int); // le code du producteur
- void consommateur(int); //le code du consommateur
-
- void produire (t_case*); // la fonction qui simule la production
- void consommer (t_case); // la fonction qui simule la consommation
-
- void mettre(t_case);
- void prendre(t_case*);
-
- //fonctions de dessin...
- void tampon(int n);
- void affiche_prod(int np);
- void affiche_cons(int nc);
- void cacher_prod(int np);
- void cacher_cons(int nc);
-
-
- //les variables globales
- t_case* mem1;// le premier segement sera vu comme un tabelau de t_case
- t_info* mem2;// le deuxième segement sera vu comme un tabelau de t_case
- int nb_cases; // la taille du tampon
- int i_mutex; // mutex pour la variable i (de mem2)
- int j_mutex; // mutex pour la variable j (de mem2)
- int plein_mutex; // mutex pour la variable plein (de mem2)
- int file_prod; // sméphore qui représente la files des producteurs bloqués
- int file_cons; // sméphore qui représente la files des producteurs bloqués
- time_t t0;
- struct sembuf op_v= {0, +1, SEM_UNDO}; // l'opération V sur les sémaphores
- struct sembuf op_p= {0, -1, SEM_UNDO}; // l'opération P sur les sémaphores
-
- //La fonction principale...
- int main (){
- pid_t f;
- int id_mem1, id_mem2; //identifiant des deux segments de mémoires partagées...
- const int taille1=0x6400, taille2=0x400; // les tailles des deux mémoires partagées...
- key_t cle;// une clé...
- int nb_p; // nombre de producteurs...
- int nb_c; // nombre de consommateurs...
- int num_p,num_c;// les numéros des producteurs et des consommateurs
- int i, st;
- ushort init_sem1[]={1}, init_sem0[]={0};
-
-
- time(&t0); // la date du début de l'exécution du père...
-
- //génération de la clé...
- if ( (cle = ftok (".", 'a')) == -1){
- perror ("ftok");
- return -1;
- }
- //génération du segment de la première mémoire partagée...
- id_mem1 = shmget (cle, taille1, IPC_CREAT|IPC_EXCL|0666);
- if (id_mem1 == -1){
- perror ("shmget - 1");
- return -1;
- }
-
- //génération de la clé...
- if ( (cle = ftok (".", 'b')) == -1){
- perror ("ftok");
- return -1;
- }
- //génération du segment de la deuxième mémoire partagée...
- id_mem2 = shmget (cle, taille2, IPC_CREAT|IPC_EXCL|0666);
- if (id_mem2 == -1){
- perror ("shmget - 2");
- return -1;
- }
-
- //génération de la clé...
- if ( (cle = ftok (".", 'c')) == -1){
- perror ("ftok");
- return -1;
- }
- //génération du i_mutex...
- i_mutex = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
- if (i_mutex == -1){
- perror ("semget - 1");
- return -1;
- }
-
- //génération de la clé...
- if ( (cle = ftok (".", 'd')) == -1){
- perror ("ftok");
- return -1;
- }
- //génération du j_mutex...
- j_mutex = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
- if (j_mutex == -1){
- perror ("semget - 2");
- return -1;
- }
-
- //génération de la clé...
- if ( (cle = ftok (".", 'e')) == -1){
- perror ("ftok");
- return -1;
- }
- //génération du plein_mutex...
- plein_mutex = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
- if (plein_mutex == -1){
- perror ("semget - 3");
- return -1;
- }
-
- //génération de la clé...
- if ( (cle = ftok (".", 'f')) == -1){
- perror ("ftok");
- return -1;
- }
- //génération du file_prod...
- file_prod = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
- if (file_prod == -1){
- perror ("semget - 4");
- return -1;
- }
-
- //génération de la clé...
- if ( (cle = ftok (".", 'g')) == -1){
- perror ("ftok");
- return -1;
- }
- //génération du file_cons...
- file_cons = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
- if (file_cons == -1){
- perror ("semget - 5");
- return -1;
- }
-
- if (semctl (i_mutex, 0, SETALL, init_sem1)==-1){
- perror ("semctl");
- return -1;
- }
- if (semctl (j_mutex, 0, SETALL, init_sem1)==-1){
- perror ("semctl");
- return -1;
- }
- if (semctl (plein_mutex, 0, SETALL, init_sem1)==-1){
- perror ("semctl");
- return -1;
- }
- if (semctl (file_prod, 0, SETALL, init_sem0)==-1){
- perror ("semctl");
- return -1;
- }
- if (semctl (file_cons, 0, SETALL, init_sem0)==-1){
- perror ("semctl");
- return -1;
- }
-
- mem1 = shmat (id_mem1, 0, 0); // le premier segement sera vu comme un tabelau de t_case
- mem2 = shmat (id_mem2, 0, 0); // le deuxième segement sera vu comme une case t_info
-
-
- //initialisation des informations de la mémoire mem2
- mem2->i=0;
- mem2->j=0;
- mem2->plein=0;
-
- //informations générales à introduire par l'utilisateur...
- printf ("\nDonnez le nombre de cases du Tampon (entre 1 et %d) : ", Max);
- while (1){
- scanf ("%d", &nb_cases);getchar();
- if ((nb_cases<1)||(nb_cases>Max))
- printf ("Erreur : vous deviez introduire un nombre entre 1 et %d : ", Max);
- else
- break;
- }
- printf ("\nDonnez le nombre de producteurs (>=1) : ");
- while (1){
- scanf ("%d", &nb_p);getchar();
- if (nb_p<1)
- printf ("Erreur : vous deviez introduire un nombre >= 1");
- else
- break;
- }
- printf ("\nDonnez le nombre de consommateurs (>=1) : ");
- while (1){
- scanf ("%d", &nb_c);getchar();
- if (nb_c<1)
- printf ("Erreur : vous deviez introduire un nombre >= 1");
- else
- break;
- }
-
- // Dessiner l'interface...
- ClrScr();
- tampon(nb_cases);
- printf ("\n");
-
- // la création des producteurs
- num_p = 1;
- for (i=0; i<nb_p; i++){
- srand (time(NULL));//assurer d'avoir des nombres aléatoires pour les différents producteurs
- f = fork();
- if (f==-1){
- perror ("fork- producteur");
- return -1;
- }
- if (f==0){//la zone des producteurs....
- producteur(num_p);
- return 0;
- }// fin de la zone des producteurs....
- num_p++;// avoir le prochain numéro de producteur
- sleep(1);// attendre une seconde avant la prochaine création d'un fils
- }
-
- // la création des consommateurs
- num_c = 1;
- for (i=0; i<nb_c; i++){
- srand (time(NULL));//assurer d'avoir des nombres aléatoires pour les différents consommateurs
- f = fork();
- if (f==-1){
- perror ("fork- producteur");
- return -1;
- }
- if (f==0){//la zone des consommateurs....
- consommateur(num_c);
- return 0;
- }// fin de la zone des consommateurs....
- num_c++;// avoir le prochain numéro de producteur
- sleep(1);// attendre une seconde avant la prochaine création d'un fils
- }
-
- //attendre tous les fils...
- for (i=0; i<nb_p+nb_c; i++)
- wait(&st);
-
- // détachement des deux segments de mémoire partagée...
- shmdt (mem1);
- shmdt (mem2);
-
- if (shmctl (id_mem1, IPC_RMID, 0) == -1){ // suppression de la première mémoire partagée...
- perror ("shmctl - suppression 1");
- return -1;
- }
- if (shmctl (id_mem2, IPC_RMID, 0) == -1){ // suppression de la première mémoire partagée...
- perror ("shmctl - suppression 2");
- return -1;
- }
- if (semctl (i_mutex, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
- perror ("semctl - 1");
- return -1;
- }
- if (semctl (j_mutex, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
- perror ("semctl - 1");
- return -1;
- }
- if (semctl (plein_mutex, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
- perror ("semctl - 1");
- return -1;
- }
- if (semctl (file_prod, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
- perror ("semctl - 1");
- return -1;
- }
- if (semctl (file_cons, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
- perror ("semctl - 1");
- return -1;
- }
-
- TextColor (BLACK);
- TextBackground(WHITE);
- ClrScr();
- GotoXY (1,1);
- return 0;
- }// fin de la fonction principale...
-
-
- //L'implémentation des fonctions
-
- void producteur(int np){//le porducteur...
- t_case c;
- time_t tc;
- time(&tc);
- affiche_prod(np);
- //srand (time(NULL));
- while (1){
- TextBackground (WHITE);
- GotoXY(15, 3+(np-1)*3); printf (" \n");
- time(&tc);
-
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(15, 3+(np-1)*3); printf ("t:%d | s'endormir\n", tc-t0);
- sleep (rand()%3);
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(15, 3+(np-1)*3); printf (" \n");
-
- time(&tc);
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(15, 3+(np-1)*3); printf ("t:%d | produire\n", tc-t0);
- produire(&c);// production d'un objet...
-
-
- sleep (rand()%2);
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(15, 3+(np-1)*3); printf (" \n");
- time(&tc);
-
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(15, 3+(np-1)*3); printf ("t:%d | Mettre dans le tampon\n", tc-t0);
- mettre (c);
-
- time(&tc);
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(15, 3+(np-1)*3); printf ("t:%d | objet mis dans le tampon \n", tc-t0);
- if ((rand()%5) == 0){
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(15, 3+(np-1)*3); printf (" \n");
- break;
- }
- }
- time(&tc);
- cacher_prod(np);
- }// fin producteur...
-
-
- void consommateur(int nc){//le consommateur...
- t_case c;
- time_t tc;
- time(&tc);
- affiche_cons(nc);
- //srand (time(NULL));
- while (1){
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(70, 3+(nc-1)*3); printf (" \n");
-
- time(&tc);
-
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(70, 3+(nc-1)*3); printf ("t:%d | s'endormir\n", tc-t0);
- sleep (rand()%3);
-
-
- time(&tc);
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(70, 3+(nc-1)*3); printf ("t:%d | prendre un objet\n", tc-t0);
-
- prendre (&c);
-
-
- time(&tc);
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(70, 3+(nc-1)*3); printf ("t:%d | consommer un objet\n", tc-t0);
- consommer(c);// cosnommer d'un objet...
-
- if ((rand()%5) == 0){
- TextBackground (WHITE);
- TextColor (BLACK);
- GotoXY(70, 3+(nc-1)*3); printf (" ");
- break;
- }
- }
- time(&tc);
- cacher_cons(nc);
- }// fin cosommateur...
-
- void produire (t_case* c){//la production
- c->nb_rand = rand()%500; // un nombre aléatoire
- c->ch_rand = rand()%100+30; // un caractère aléatoire
- }// fin production
-
- void consommer (t_case c){//la consommation
-
- }// fin consommation
-
- void mettre(t_case c){// debut mettre
- semop(plein_mutex, &op_p, 1);
- if (mem2->plein == nb_cases){
- semop(plein_mutex, &op_v, 1);
- semop(file_prod, &op_p, 1);// bloquage...
- semop(plein_mutex, &op_p, 1);
- }
- semop(plein_mutex, &op_v, 1);
-
- semop(i_mutex, &op_p, 1);
- mem1[mem2->i].nb_rand = c.nb_rand;
- mem1[mem2->i].ch_rand = c.ch_rand;
- mem2->i = (mem2->i+1) % nb_cases;
- semop(plein_mutex, &op_p, 1);
- mem2->plein++;
- semop(file_cons, &op_v, 1);
- semop(plein_mutex, &op_v, 1);
- GotoXY (52 ,3+mem2->i*3);
- TextColor (RED);
- printf (" \n");
- semop(i_mutex, &op_v, 1);
- }// fin mettre
-
- void prendre(t_case *c){// debut prendre
- semop(plein_mutex, &op_p, 1);
- if (mem2->plein == 0){
- semop(plein_mutex, &op_v, 1);
- semop(file_cons, &op_p, 1);// bloquage...
- semop(plein_mutex, &op_p, 1);
- }
- semop(plein_mutex, &op_v, 1);
-
- semop(j_mutex, &op_p, 1);
- c->nb_rand = mem1[mem2->j].nb_rand;
- c->ch_rand = mem1[mem2->j].ch_rand;
- mem2->j = (mem2->j+1) % nb_cases;
- semop(plein_mutex, &op_p, 1);
- mem2->plein--;
- semop(file_prod, &op_v, 1);
- semop(plein_mutex, &op_v, 1);
- semop(j_mutex, &op_v, 1);
- }// fin prendre
-
-
- // les fonctions de dessins..
- void tampon(int n){ //afficher le tampon...
- TextColor (BLUE);
- TextBackground(WHITE);
- int i;
- for (i=0; i<n; i++){
- GotoXY(51 ,2+i*3);
- printf ("_____________");
- GotoXY(50, 3+i*3);
- printf ("| |");
- GotoXY(50, 4+i*3);
- printf ("| |");
- GotoXY(50, 5+i*3);
- printf ("| |");
- GotoXY(51, 5+i*3);
- printf ("_____________\n");
- }
- GotoXY (54, 3+i*3);
- TextColor (RED);
- printf ("TAMPON");
- }
-
- void affiche_prod(int np){//afficher producteur
- GotoXY(5, 3+(np-1)*3);
- TextColor (WHITE);
- TextBackground(BLUE);
- printf (" Prod %d \n", np);
- }
-
- void affiche_cons(int nc){//afficher consommateur
- GotoXY(100, 3+(nc-1)*3);
- TextColor (WHITE);
- TextBackground(RED);
- printf (" Cons %d \n", nc);
- }
-
- void cacher_prod(int np){
- GotoXY(5, 3+(np-1)*3);
- TextColor (WHITE);
- TextBackground(WHITE);
- printf (" \n", np);
- }
-
- void cacher_cons(int nc){
- GotoXY(100, 3+(nc-1)*3);
- TextColor (WHITE);
- TextBackground(WHITE);
- printf (" \n", nc);
- }
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <wait.h>
#include <sys/ipc.h> // la bibliothèque des ipc : IPC_CREAT, IPC_EXCL, ...
#include <sys/sem.h> // La bibliothèque des sémaphores...
#include <sys/shm.h> // La bibliothèque de la mémoire partgeé...
#include "ccrt.h"
#define Max 10// le nombre maximal de cases dans le tampon...
// les structures t_case et t_info
typedef struct {// cette structure représente le contenue d'une case d'un tampon (contenant N cases)...
int nb_rand;
char ch_rand;
} t_case;
typedef struct {
int i,j; // i: indice de la case où sera la production. j: indice de la case où sera la consommation.
int plein;// nombre indiquant le nombre de cases pleines...
} t_info;
//les prototypes des fonctions..
void producteur(int); // le code du producteur
void consommateur(int); //le code du consommateur
void produire (t_case*); // la fonction qui simule la production
void consommer (t_case); // la fonction qui simule la consommation
void mettre(t_case);
void prendre(t_case*);
//fonctions de dessin...
void tampon(int n);
void affiche_prod(int np);
void affiche_cons(int nc);
void cacher_prod(int np);
void cacher_cons(int nc);
//les variables globales
t_case* mem1;// le premier segement sera vu comme un tabelau de t_case
t_info* mem2;// le deuxième segement sera vu comme un tabelau de t_case
int nb_cases; // la taille du tampon
int i_mutex; // mutex pour la variable i (de mem2)
int j_mutex; // mutex pour la variable j (de mem2)
int plein_mutex; // mutex pour la variable plein (de mem2)
int file_prod; // sméphore qui représente la files des producteurs bloqués
int file_cons; // sméphore qui représente la files des producteurs bloqués
time_t t0;
struct sembuf op_v= {0, +1, SEM_UNDO}; // l'opération V sur les sémaphores
struct sembuf op_p= {0, -1, SEM_UNDO}; // l'opération P sur les sémaphores
//La fonction principale...
int main (){
pid_t f;
int id_mem1, id_mem2; //identifiant des deux segments de mémoires partagées...
const int taille1=0x6400, taille2=0x400; // les tailles des deux mémoires partagées...
key_t cle;// une clé...
int nb_p; // nombre de producteurs...
int nb_c; // nombre de consommateurs...
int num_p,num_c;// les numéros des producteurs et des consommateurs
int i, st;
ushort init_sem1[]={1}, init_sem0[]={0};
time(&t0); // la date du début de l'exécution du père...
//génération de la clé...
if ( (cle = ftok (".", 'a')) == -1){
perror ("ftok");
return -1;
}
//génération du segment de la première mémoire partagée...
id_mem1 = shmget (cle, taille1, IPC_CREAT|IPC_EXCL|0666);
if (id_mem1 == -1){
perror ("shmget - 1");
return -1;
}
//génération de la clé...
if ( (cle = ftok (".", 'b')) == -1){
perror ("ftok");
return -1;
}
//génération du segment de la deuxième mémoire partagée...
id_mem2 = shmget (cle, taille2, IPC_CREAT|IPC_EXCL|0666);
if (id_mem2 == -1){
perror ("shmget - 2");
return -1;
}
//génération de la clé...
if ( (cle = ftok (".", 'c')) == -1){
perror ("ftok");
return -1;
}
//génération du i_mutex...
i_mutex = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
if (i_mutex == -1){
perror ("semget - 1");
return -1;
}
//génération de la clé...
if ( (cle = ftok (".", 'd')) == -1){
perror ("ftok");
return -1;
}
//génération du j_mutex...
j_mutex = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
if (j_mutex == -1){
perror ("semget - 2");
return -1;
}
//génération de la clé...
if ( (cle = ftok (".", 'e')) == -1){
perror ("ftok");
return -1;
}
//génération du plein_mutex...
plein_mutex = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
if (plein_mutex == -1){
perror ("semget - 3");
return -1;
}
//génération de la clé...
if ( (cle = ftok (".", 'f')) == -1){
perror ("ftok");
return -1;
}
//génération du file_prod...
file_prod = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
if (file_prod == -1){
perror ("semget - 4");
return -1;
}
//génération de la clé...
if ( (cle = ftok (".", 'g')) == -1){
perror ("ftok");
return -1;
}
//génération du file_cons...
file_cons = semget( cle, 1 ,IPC_CREAT|IPC_EXCL|0666);
if (file_cons == -1){
perror ("semget - 5");
return -1;
}
if (semctl (i_mutex, 0, SETALL, init_sem1)==-1){
perror ("semctl");
return -1;
}
if (semctl (j_mutex, 0, SETALL, init_sem1)==-1){
perror ("semctl");
return -1;
}
if (semctl (plein_mutex, 0, SETALL, init_sem1)==-1){
perror ("semctl");
return -1;
}
if (semctl (file_prod, 0, SETALL, init_sem0)==-1){
perror ("semctl");
return -1;
}
if (semctl (file_cons, 0, SETALL, init_sem0)==-1){
perror ("semctl");
return -1;
}
mem1 = shmat (id_mem1, 0, 0); // le premier segement sera vu comme un tabelau de t_case
mem2 = shmat (id_mem2, 0, 0); // le deuxième segement sera vu comme une case t_info
//initialisation des informations de la mémoire mem2
mem2->i=0;
mem2->j=0;
mem2->plein=0;
//informations générales à introduire par l'utilisateur...
printf ("\nDonnez le nombre de cases du Tampon (entre 1 et %d) : ", Max);
while (1){
scanf ("%d", &nb_cases);getchar();
if ((nb_cases<1)||(nb_cases>Max))
printf ("Erreur : vous deviez introduire un nombre entre 1 et %d : ", Max);
else
break;
}
printf ("\nDonnez le nombre de producteurs (>=1) : ");
while (1){
scanf ("%d", &nb_p);getchar();
if (nb_p<1)
printf ("Erreur : vous deviez introduire un nombre >= 1");
else
break;
}
printf ("\nDonnez le nombre de consommateurs (>=1) : ");
while (1){
scanf ("%d", &nb_c);getchar();
if (nb_c<1)
printf ("Erreur : vous deviez introduire un nombre >= 1");
else
break;
}
// Dessiner l'interface...
ClrScr();
tampon(nb_cases);
printf ("\n");
// la création des producteurs
num_p = 1;
for (i=0; i<nb_p; i++){
srand (time(NULL));//assurer d'avoir des nombres aléatoires pour les différents producteurs
f = fork();
if (f==-1){
perror ("fork- producteur");
return -1;
}
if (f==0){//la zone des producteurs....
producteur(num_p);
return 0;
}// fin de la zone des producteurs....
num_p++;// avoir le prochain numéro de producteur
sleep(1);// attendre une seconde avant la prochaine création d'un fils
}
// la création des consommateurs
num_c = 1;
for (i=0; i<nb_c; i++){
srand (time(NULL));//assurer d'avoir des nombres aléatoires pour les différents consommateurs
f = fork();
if (f==-1){
perror ("fork- producteur");
return -1;
}
if (f==0){//la zone des consommateurs....
consommateur(num_c);
return 0;
}// fin de la zone des consommateurs....
num_c++;// avoir le prochain numéro de producteur
sleep(1);// attendre une seconde avant la prochaine création d'un fils
}
//attendre tous les fils...
for (i=0; i<nb_p+nb_c; i++)
wait(&st);
// détachement des deux segments de mémoire partagée...
shmdt (mem1);
shmdt (mem2);
if (shmctl (id_mem1, IPC_RMID, 0) == -1){ // suppression de la première mémoire partagée...
perror ("shmctl - suppression 1");
return -1;
}
if (shmctl (id_mem2, IPC_RMID, 0) == -1){ // suppression de la première mémoire partagée...
perror ("shmctl - suppression 2");
return -1;
}
if (semctl (i_mutex, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
perror ("semctl - 1");
return -1;
}
if (semctl (j_mutex, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
perror ("semctl - 1");
return -1;
}
if (semctl (plein_mutex, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
perror ("semctl - 1");
return -1;
}
if (semctl (file_prod, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
perror ("semctl - 1");
return -1;
}
if (semctl (file_cons, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
perror ("semctl - 1");
return -1;
}
TextColor (BLACK);
TextBackground(WHITE);
ClrScr();
GotoXY (1,1);
return 0;
}// fin de la fonction principale...
//L'implémentation des fonctions
void producteur(int np){//le porducteur...
t_case c;
time_t tc;
time(&tc);
affiche_prod(np);
//srand (time(NULL));
while (1){
TextBackground (WHITE);
GotoXY(15, 3+(np-1)*3); printf (" \n");
time(&tc);
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(15, 3+(np-1)*3); printf ("t:%d | s'endormir\n", tc-t0);
sleep (rand()%3);
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(15, 3+(np-1)*3); printf (" \n");
time(&tc);
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(15, 3+(np-1)*3); printf ("t:%d | produire\n", tc-t0);
produire(&c);// production d'un objet...
sleep (rand()%2);
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(15, 3+(np-1)*3); printf (" \n");
time(&tc);
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(15, 3+(np-1)*3); printf ("t:%d | Mettre dans le tampon\n", tc-t0);
mettre (c);
time(&tc);
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(15, 3+(np-1)*3); printf ("t:%d | objet mis dans le tampon \n", tc-t0);
if ((rand()%5) == 0){
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(15, 3+(np-1)*3); printf (" \n");
break;
}
}
time(&tc);
cacher_prod(np);
}// fin producteur...
void consommateur(int nc){//le consommateur...
t_case c;
time_t tc;
time(&tc);
affiche_cons(nc);
//srand (time(NULL));
while (1){
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(70, 3+(nc-1)*3); printf (" \n");
time(&tc);
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(70, 3+(nc-1)*3); printf ("t:%d | s'endormir\n", tc-t0);
sleep (rand()%3);
time(&tc);
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(70, 3+(nc-1)*3); printf ("t:%d | prendre un objet\n", tc-t0);
prendre (&c);
time(&tc);
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(70, 3+(nc-1)*3); printf ("t:%d | consommer un objet\n", tc-t0);
consommer(c);// cosnommer d'un objet...
if ((rand()%5) == 0){
TextBackground (WHITE);
TextColor (BLACK);
GotoXY(70, 3+(nc-1)*3); printf (" ");
break;
}
}
time(&tc);
cacher_cons(nc);
}// fin cosommateur...
void produire (t_case* c){//la production
c->nb_rand = rand()%500; // un nombre aléatoire
c->ch_rand = rand()%100+30; // un caractère aléatoire
}// fin production
void consommer (t_case c){//la consommation
}// fin consommation
void mettre(t_case c){// debut mettre
semop(plein_mutex, &op_p, 1);
if (mem2->plein == nb_cases){
semop(plein_mutex, &op_v, 1);
semop(file_prod, &op_p, 1);// bloquage...
semop(plein_mutex, &op_p, 1);
}
semop(plein_mutex, &op_v, 1);
semop(i_mutex, &op_p, 1);
mem1[mem2->i].nb_rand = c.nb_rand;
mem1[mem2->i].ch_rand = c.ch_rand;
mem2->i = (mem2->i+1) % nb_cases;
semop(plein_mutex, &op_p, 1);
mem2->plein++;
semop(file_cons, &op_v, 1);
semop(plein_mutex, &op_v, 1);
GotoXY (52 ,3+mem2->i*3);
TextColor (RED);
printf (" \n");
semop(i_mutex, &op_v, 1);
}// fin mettre
void prendre(t_case *c){// debut prendre
semop(plein_mutex, &op_p, 1);
if (mem2->plein == 0){
semop(plein_mutex, &op_v, 1);
semop(file_cons, &op_p, 1);// bloquage...
semop(plein_mutex, &op_p, 1);
}
semop(plein_mutex, &op_v, 1);
semop(j_mutex, &op_p, 1);
c->nb_rand = mem1[mem2->j].nb_rand;
c->ch_rand = mem1[mem2->j].ch_rand;
mem2->j = (mem2->j+1) % nb_cases;
semop(plein_mutex, &op_p, 1);
mem2->plein--;
semop(file_prod, &op_v, 1);
semop(plein_mutex, &op_v, 1);
semop(j_mutex, &op_v, 1);
}// fin prendre
// les fonctions de dessins..
void tampon(int n){ //afficher le tampon...
TextColor (BLUE);
TextBackground(WHITE);
int i;
for (i=0; i<n; i++){
GotoXY(51 ,2+i*3);
printf ("_____________");
GotoXY(50, 3+i*3);
printf ("| |");
GotoXY(50, 4+i*3);
printf ("| |");
GotoXY(50, 5+i*3);
printf ("| |");
GotoXY(51, 5+i*3);
printf ("_____________\n");
}
GotoXY (54, 3+i*3);
TextColor (RED);
printf ("TAMPON");
}
void affiche_prod(int np){//afficher producteur
GotoXY(5, 3+(np-1)*3);
TextColor (WHITE);
TextBackground(BLUE);
printf (" Prod %d \n", np);
}
void affiche_cons(int nc){//afficher consommateur
GotoXY(100, 3+(nc-1)*3);
TextColor (WHITE);
TextBackground(RED);
printf (" Cons %d \n", nc);
}
void cacher_prod(int np){
GotoXY(5, 3+(np-1)*3);
TextColor (WHITE);
TextBackground(WHITE);
printf (" \n", np);
}
void cacher_cons(int nc){
GotoXY(100, 3+(nc-1)*3);
TextColor (WHITE);
TextBackground(WHITE);
printf (" \n", nc);
}
Historique
- 12 janvier 2009 16:48:15 :
- rien de spécial :)
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
portage Linux vers visual C++ [ par acsx ]
Salut,J'ai un programme écrit en C sous Linux et je souhaite le faire tourner sous Visual C++ 6.0 sous Windows.J'ai donc créé un projet win32 et intég
Problème pour ouvrir une fenetre et écrire dedans sous Linux en C++ [ par Nicolas ]
Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas
Problème pour ouvrir une fenetre sous linux en c++ [ par Nicolas ]
Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas
Problème pour ouvrir une fenetre sous linux en c++ [ par Nicolas ]
Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas
Linux et opengl [ par FleXus ]
Helloje voudrais savoir comment utiliser et compiler un prog avec les fonctions d'opengl sous linux(j'utilise actuellement Kdevelop clone de visual c+
processus sous linux [g++] [ par satanik_mike ]
Bonjour,Je suis en train de d?velopper un serveur POP, SMTP en C++ sous linux, mais je bloque sur une petit probl?me d'ex?cution.J'ai fait un ex?cutbl
Comment compiler avec GTK (sous linux) [ par defcon ]
Bonjour à touse, voilà, je voulais savoir comment compiler mon code source souis linux (avec librairie GTK)???Merci d'avance pour votre réponse.Amical
Comment compiler GTK (sous linux)??? [ par defcon ]
Bonjour à touse, voilà, je voulais savoir comment compiler mon code source souis linux (avec librairie GTK)???Merci d'avance pour votre réponse.Amical
Thread [ par Vince007 ]
Bonjour, je vous laisse se message pour savoir si qqu'un qui connait bien les thread et les sémaphores sous Linux pourrait m'indiquer la méthode de co
codes sources linux [ par Edzome ]
salut à tous !!!je désire savoir ou est-ce que je peux me procurer le code source du SE linux...merci d'avance...
|
Derniers Blogs
TECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURSTECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURS par ROMELARD Fabrice
Animé par: Laurent Cotton Le développement dans SharePoint 2010 passe par plusieurs axes qui seront évoqués dans cette session, mais plus particulièrement les développements simples lié au besoin Business Business Connectivity Services Ce BCS es...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion
Forum
RE : WIN APIRE : WIN API par racpp
Cliquez pour lire la suite par racpp
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|