🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#1474
Author: rodmatt
Date: Tue, 22 Nov 2005 05:08
6 lines
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
#1475
Author: Abelazo
Date: Tue, 22 Nov 2005 18:14
159 lines
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
#1476
Author: rodmatt
Date: Wed, 23 Nov 2005 05:29
1 lines
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