Pseudocódigo/Diagramas de Flujo - productor consumidor

 
Vista:
sin imagen de perfil
Val: 1
Ha aumentado su posición en 18 puestos en Pseudocódigo/Diagramas de Flujo (en relación al último mes)
Gráfica de Pseudocódigo/Diagramas de Flujo

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
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;
 
			}
		}
	}
}
como se haria
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder