🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #1475

Re: Productor - Consumidor con Semáforos

#1475
From: 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
Technical Details
Message-ID: <1132683272.856599.76530@z14g2000cwz.googlegroups.com>
Path: arc1-ca.pugleaf.net!g2news1.google.com!postnews.google.com!z14g2000cwz.googlegroups.com!not-for-mail
References: <1132636128.462264.220870@g43g2000cwa.googlegroups.com>

Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,e896bba2532a9445
X-Google-Attributes: gidf86c8,public
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!postnews.google.com!z14g2000cwz.googlegroups.com!not-for-mail
From: "Abelazo" <abelazo@gmail.com>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Productor - Consumidor con Semáforos
Date: 22 Nov 2005 10:14:32 -0800
Organization: http://groups.google.com
Lines: 160
Message-ID: <1132683272.856599.76530@z14g2000cwz.googlegroups.com>
References: <1132636128.462264.220870@g43g2000cwa.googlegroups.com>
NNTP-Posting-Host: 80.58.0.46
Mime-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
X-Trace: posting.google.com 1132683278 26414 127.0.0.1 (22 Nov 2005 18:14:38 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Tue, 22 Nov 2005 18:14:38 +0000 (UTC)
In-Reply-To: <1132636128.462264.220870@g43g2000cwa.googlegroups.com>
User-Agent: G2/0.2
X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.0; es-ES; rv:1.7.12) Gecko/20050919 Firefox/1.0.7,gzip(gfe),gzip(gfe)
X-HTTP-Via: HTTP/1.1 proxy[AC1E0249] (Traffic-Server/5.5.1-59360 [uScM])
Complaints-To: groups-abuse@google.com
Injection-Info: z14g2000cwz.googlegroups.com; posting-host=80.58.0.46;
   posting-account=NL0L_Q0AAAAwyJEeM_7UhBM0FxMpytwa