Article View: es.comp.os.linux.programacion
Article #1475Re: Productor - Consumidor con Semáforos
From: 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
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-mailReferences:
<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