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 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYSTECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYS par ROMELARD Fabrice
Speakers : Lionel Limozin et Alain Marty La session commence par une découverte de SharePoint à travers la mise en place d'un environnement SharePoint pour la gestion des Sessions animées par BeWise. Le besoin est très ba...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PERSPECTIVE 3.0 POUR SILVERLIGHT 5.0PERSPECTIVE 3.0 POUR SILVERLIGHT 5.0 par odewit
Je viens de publier la version 3.0 de Perspective pour Silverlight, qui regroupe un portage sous Silverlight 5.0 des fonctionnalités de Perspective 2.0, le framework 3D de haut-niveau introduit récemment et de nouveaux exemples de code. En voici la li...
Cliquez pour lire la suite de l'article par odewit TECHDAYS PARIS 2012 : TOP 10 DES BEST PRACTICES POUR SQL SERVERTECHDAYS PARIS 2012 : TOP 10 DES BEST PRACTICES POUR SQL SERVER par ROMELARD Fabrice
Speaker : Nadia Ben El Kadi Configuration machine La session commence par la toute première question à se poser lors de la mise en place d'environnement SQL Server, la configuration des machines : Type de mac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : KINECT + OFFICE 365 UN BON GESTE POUR VOTRE SITECHDAYS PARIS 2012 : KINECT + OFFICE 365 UN BON GESTE POUR VOTRE SI par ROMELARD Fabrice
Speakers : Fabrice Barbin, Samuel Blanchard, Julien Lo Presti Titre Prometteur et attractif invitant à voir comment lier le composant ludique Kinect dans le cadre d'une structure IT classique, notamment au travers de la plat...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE DU PREMIER JOURTECHDAYS PARIS 2012 : PLEINIèRE DU PREMIER JOUR par ROMELARD Fabrice
KeyNotes du premier jour pour les développeurs. La session est principalement axée sur une des principales directions prise par Microsoft à travers tous ses nouveaux produits : Cloud privé ou public (Solution Azure) ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : C++ RE : C++ par louis14
Cliquez pour lire la suite par louis14 C++ C++ par yesoun1
Cliquez pour lire la suite par yesoun1
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|