Discussion:
Productor - Consumidor con Semáforos
(demasiado antiguo para responder)
rodmatt
2005-11-22 05:08:48 UTC
Permalink
Hola, estoy buscando el código fuente en C del programa que soluciona
el problema de productor consumidor utilizando semáforos.
Si alguien pudiera facilitármelo, o guiarme en la forma de
implementarlo estaría muy agradecido.

Saludos
Abelazo
2005-11-22 18:14:32 UTC
Permalink
*De http://arcos.inf.uc3m.es/~ssoo-va/ssoo-va/ssoo-va.html*

El código del proceso productor será:

#include <sys/mman.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <fcntl.h>
#include <unistd.h>

#define MAX_BUFFER 1024 /* tamaño del buffer */
#define DATOS_A_PRODUCIR 100000 /* datos a producir */

void productor(void);

sem_t *huecos;
sem_t *elementos;
int *buffer; /* puntero al buffer de números enteros */

int main(void){
int shd;

/* se crean e inician semáforos */
huecos = sem_open("HUECOS", O_CREAT ,00666, 1024);
elementos = sem_open("ELEMENTOS", O_CREAT, 00666, 0);
if (huecos == SEM_FAILED || elementos == SEM_FAILED) {
perror("Error en sem_open");
exit(1);
}

/* se crea el segmento de memoria compartida utilizado como
buffer circular */
shd = open("BUFFER",O_CREAT|O_TRUNC|O_RDWR,00666);
if (shd == -1) {
perror("Error en open");
exit(1);
}
ftruncate(shd,(MAX_BUFFER*sizeof(int)));
buffer = mmap(NULL,(MAX_BUFFER*sizeof(int)) , PROT_WRITE, MAP_SHARED,
shd,0);
if (buffer == MAP_FAILED) {
perror("Error en mmap");
exit(1);
}
productor(); /* se ejecuta el código del productor */

/* se desproyecta el buffer */
munmap(buffer, MAX_BUFFER*sizeof(int));
close (shd);
unlink("BUFFER");

/* cierran y se destruyen los semáforos */
sem_close(huecos);
sem_close(elementos);
sem_unlink("HUECOS");
sem_unlink("ELEMENTOS");

return 0;
}


/* código del proceso productor */
void productor(void) {
int dato; /* dato a producir */
int posicion = 0; /* posición donde insertar el elemento*/
int j;

for (j=0; j<DATOS_A_PRODUCIR; j++) {
dato = j;
printf("Produce %d\n", dato);
sem_trywait(huecos); /* un hueco menos */
buffer[posicion]=dato;
posicion=(posicion+1) % MAX_BUFFER; /* nueva posición */
sem_post(elementos); /* un elemento más);*/
}
return;
}





El consumidor será:

#include <sys/mman.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <fcntl.h>


#define MAX_BUFFER 1024 /* tamaño del buffer */
#define DATOS_A_PRODUCIR 100000 /* datos a producir */

void consumidor(void);

sem_t *huecos;
sem_t *elementos;
int *buffer; /* buffer de números enteros */

int main(void){
int shd;

/* se abren los semáforos */
huecos = sem_open("HUECOS", 0);
elementos = sem_open("ELEMENTOS", 0);
if (huecos == SEM_FAILED || elementos == SEM_FAILED) {
perror("Error en sem_open");
exit(1);
}

/* se abre el segmento de memoria compartida utilizado como
buffer circular */
shd = open("BUFFER", O_RDONLY);
if (shd == -1) {
perror("Error en open");
exit(0);
}
buffer = (int *)mmap(NULL, MAX_BUFFER*sizeof(int),
PROT_READ,MAP_SHARED, shd, 0);
if (buffer == NULL) {
perror("Error en mmap");
exit(1);
}

consumidor(); /* se ejecuta el código del consumidor */

/* se desproyecta el buffer */
munmap(buffer, MAX_BUFFER*sizeof(int));
close(shd);

/* se cierran semáforos */
sem_close(huecos);
sem_close(elementos);
exit(0);
}


/* código del proceso productor */
void consumidor(void){
int dato; /* dato a consumir */
int posicion = 0; /* posición que indica el elemento a extraer */
int j;

for (j=0; j<DATOS_A_PRODUCIR; j++) {
dato = j;
sem_wait(elementos); /* un elemento menos */
dato = buffer[posicion];
printf("Consume %d\n", dato);
posicion=(posicion+1) % MAX_BUFFER; /* nueva posición */
sem_post(huecos); /* un hueco más); */
}
return;
}

Espero que te valga

ABEL
rodmatt
2005-11-23 05:29:39 UTC
Permalink
Ok, lo voy a probar...gracias!!!

Loading...