Thread View: es.comp.os.linux.programacion
3 messages
3 total messages
Started by rodmatt
Tue, 22 Nov 2005 05:08
Productor - Consumidor con Semáforos
Author: rodmatt
Date: Tue, 22 Nov 2005 05:08
Date: Tue, 22 Nov 2005 05:08
6 lines
1464 bytes
1464 bytes
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
Re: Productor - Consumidor con Semáforos
Author: Abelazo
Date: Tue, 22 Nov 2005 18:14
Date: Tue, 22 Nov 2005 18:14
159 lines
5078 bytes
5078 bytes
*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
Re: Productor - Consumidor con Semáforos
Author: rodmatt
Date: Wed, 23 Nov 2005 05:29
Date: Wed, 23 Nov 2005 05:29
1 lines
1404 bytes
1404 bytes
Ok, lo voy a probar...gracias!!!
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads