productor consumidor
Publicado por antonio (1 intervención) el 21/10/2016 13:02:37
productor con dos consumidores con buffer circular, el productor incluirá un código que enviara a los dos consumidores, mientras que los procesos consumidores mostraran las letras. Ambos procesos accederán a sus secciones críticas 200 veces cada uno.
se hacerlo con un productor y un consumidor pero no con dos consumidores
consumidor
productor
como se haria
se hacerlo con un productor y un consumidor pero no con dos consumidores
consumidor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define SEMKEY 75
#define SAMKEY 80
void main(){
int sema;
int salida=0;
char letra;
int semid;
char *anadir;
//Esperamos ejecute el productor el (1) es el numero de segundos que esperamos
sleep(1);
//Region de memoria que tiene 10 bytes
sema=shmget(SAMKEY, 10, 0777);
//si sale un error dejamos de ejecutar.
if(sema == -1){
printf("Se ha producido un error.");
exit(0);
}else{
anadir=shmat(sema, 0, 0);
//estructura del semaforo
struct sembuf sem_oper;
union semun{
int val;
struct semid_ds *semstat;
unsigned short *array;
}arg;
//obtenemos los 2 semaforos con SEMKEY que ha de ser el mismo con todos los permisos
semid=semget(SEMKEY, 2, 0777);
//En caso de que semid de un error salimos si no seguimos
if(semid == -1){
printf("Se ha producido un error ");
exit(0);
}else{
//Bucle for para mostrara las cien letras
for(int i=0;i<=199;i++){
//operacion en el semaforo 1 (espacio disponible)
semop (semid, &sem_oper, 1);
sem_oper.sem_num = 1;
sem_oper.sem_op = -1;//hago un wait (-1)
sem_oper.sem_flg = SEM_UNDO;
letra=anadir[salida];//obtenemos la letra del buffer
salida++; //establecemos el proximo punto del que el buffer obtendra un caracter
salida = salida%10;//En caso de que se haya leido el buffer completo se vuelve al principio.
printf("%c", letra);
//operacion en el semaforo 0 (elemento listo)
semop (semid, &sem_oper, 1);
sem_oper.sem_num = 0;
sem_oper.sem_op = 1;//hago un signal (1)
sem_oper.sem_flg = SEM_UNDO;
}
}
semctl (semid, 2, IPC_RMID, 0);//eliminar los semaforos
}
shmdt(anadir);//Elimina la region de memoria compartida.
}
productor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define SEMKEY 75
#define SAMKEY 80
void main(){
int introducir = 0;
int sema;
char *anadir;
char letra=64;
int semid;
//estructura del semaforo
struct sembuf sem_oper;
union semun{
int val;
struct semid_ds *semstat;
unsigned short *array;
}arg;
//crear la region de memoria compartida de tamaño 10 bytes
sema= shmget(SAMKEY, 10, 0777 | IPC_CREAT);
if( sema== -1){
printf("Se ha producido un error.");
exit(0);
}else{
anadir = shmat(sema, 0, 0);
semid=semget(SEMKEY, 2, 0777 | IPC_CREAT);
//En caso de que semid de un error salimos si no seguimos
if(semid == -1){
printf("Se ha producido un error.");
}else{
arg.array=(unsigned short *)malloc (sizeof (short)*2);//reservamos espacio en memoria para dos semaforos
arg.array[0]=1;//inicializamos los semaforos
arg.array[1]=0;
semctl (semid, 2, SETALL, arg);//2 semaforos
//Bucle for para mostrar letras 200 veces
for(int i=0;i<=199;i++){
//si la letra pasa de Z, vuelve a la A
if (letra < 90){
letra++;
}
else
letra=65;
//operacion wait en el semaforo 0 solo una vez
semop (semid, &sem_oper, 1);
sem_oper.sem_num = 0;
sem_oper.sem_op = -1;
sem_oper.sem_flg = SEM_UNDO;
anadir[introducir]=letra;//añadimos la letra en el buffer
introducir++;//establecemos el proximo punto del que el buffer introducira un caracter
introducir = introducir%10;//Si ha terminado el buffer se vuelve al principio si existe algun espacio.
//operacion signal en el semaforo 1 solo una vez
semop (semid, &sem_oper, 1);
sem_oper.sem_num = 1;
sem_oper.sem_op = 1;
sem_oper.sem_flg = SEM_UNDO;
}
}
}
}
Valora esta pregunta
0