programa en C que implemente el problema del productor/consumidor con 2 procesos
Publicado por Juan José (7 intervenciones) el 21/10/2020 13:13:54
Buenos dias/tardes/noches,
Estoy haciendo un ejercicio en C. Dejo el enunciado al completo a continuación:
Si alguien puede, me gustaría solucionarlo con ayuda, si puede ser realizando una videollamada o algo parecido me vendría genial. Yo soy residente en España.
Crear un programa en C que implemente el problema del productor/consumidor con 2 procesos independientes. Para ello, será necesario utilizar semáforos y memoria compartida. El Productor obtendrá los datos de contacto de diversas personas y se los enviará al Consumidor para que éste los muestre por pantalla. Para determinar el número de contactos a transferir, el Productor obtendrá dicha información por parámetros. Los datos de contacto están formados por la siguiente información:
• Apellido1
• Apellido2
• Nombre
• Email
• Telf. Móvil
El Productor creará una estructura (mediante struct) para almacenar los datos de un sólo contacto y almacenará dicha estructura en el buffer, el cuál será construido mediante memoria compartida. El buffer podrá almacenar simultáneamente hasta 5 contactos. El Consumidor obtendrá los datos de cada contacto del buffer y los mostrará por pantalla. Este proceso será iterativo hasta que se envíe todos los contactos. Tener en cuenta obligatoriamente los siguientes aspectos para implementar el código:
• Tanto el conjunto de los semáforos como la memoria compartida serán creados por el Consumidor.
• El Productor será el único proceso que obtiene el número de contactos a transferir por parámetro.
Nota: El Consumidor no tiene que saber cuantos contactos le enviará el Productor. Por tanto, para que el Consumidor pueda acabar su ejecución, el Productor tendrá que pasarle alguna información a éste. Pensad cómo resolver este problema.
Dejo el código del productor:
Y del consumidor:
Estoy haciendo un ejercicio en C. Dejo el enunciado al completo a continuación:
Si alguien puede, me gustaría solucionarlo con ayuda, si puede ser realizando una videollamada o algo parecido me vendría genial. Yo soy residente en España.
Crear un programa en C que implemente el problema del productor/consumidor con 2 procesos independientes. Para ello, será necesario utilizar semáforos y memoria compartida. El Productor obtendrá los datos de contacto de diversas personas y se los enviará al Consumidor para que éste los muestre por pantalla. Para determinar el número de contactos a transferir, el Productor obtendrá dicha información por parámetros. Los datos de contacto están formados por la siguiente información:
• Apellido1
• Apellido2
• Nombre
• Telf. Móvil
El Productor creará una estructura (mediante struct) para almacenar los datos de un sólo contacto y almacenará dicha estructura en el buffer, el cuál será construido mediante memoria compartida. El buffer podrá almacenar simultáneamente hasta 5 contactos. El Consumidor obtendrá los datos de cada contacto del buffer y los mostrará por pantalla. Este proceso será iterativo hasta que se envíe todos los contactos. Tener en cuenta obligatoriamente los siguientes aspectos para implementar el código:
• Tanto el conjunto de los semáforos como la memoria compartida serán creados por el Consumidor.
• El Productor será el único proceso que obtiene el número de contactos a transferir por parámetro.
Nota: El Consumidor no tiene que saber cuantos contactos le enviará el Productor. Por tanto, para que el Consumidor pueda acabar su ejecución, el Productor tendrá que pasarle alguna información a éste. Pensad cómo resolver este problema.
Dejo el código del 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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* PROCESO PRODUCTOR */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define KEY 100
#define MB 0 // ID del semáforo Manipulación del Buffer
#define EL 1 // ID del semáforo Espacio Libre
#define ED 2 // ID del semáforo Elemento Disponible
#define TAMBUFFER 5 // TAMaño del BUFFER
int main (argc, argv)
int argc;
char **argv; {
/* Declaración de variables */
int i;
int numContactos; /* número de contactos a visualizar */
int semid; /* ID al conjunto de semáforos */
int shmid; /* ID a la memoria compartida para almacenar el buffer */
struct DatosContacto {
Aquí vienen declarados todos los datos de un contacto
} contacto, *addr; /* contacto se utiliza para almacenar los datos de un contacto */
/* *addr es un puntero a la memoria compartida */
struct sembuf sem_oper; /* Para las operaciones wait y signal con semáforos */
/* Determinar el número de contactos a producir */
Aquí viene el código que determina el número de contactos
/* Acceder a un conjunto de 3 semáforos ya existente */
semid=semget(KEY, 3, 0770);
if (semid == -1) {
printf(“\nError en el acceso al conjunto de semáforos”);
exit(1); /* Error 1: error en el acceso al conjunto de semáforos */
}
/* OJO: No hay que inicializar los semáforos. Lo ha hecho el proceso Consumidor */
/* Acceder a la memoria compartida */
shmid = shmget(KEY, calcular el tamaño, 0770);
if (shmid == -1) {
printf(“\nError en la creación de la Memoria compartida”);
exit(2); /* Error 2: error al crear la Memoria compartida */
}
/* Enlazar la memoria compartida al proceso */
addr = shmat(shmid, 0, 0);
/* Pasarle al Consumidor el número de contactos que se va a producer */
Aquí viene el código para indicarle al consumidor cuantos contactos tiene que consumir
/* Repetir para cada contacto /*/
for (i=0; i<numContactos; i++) {
/* Producir elemento */
Aquí viene el código de producir un elemento
/* Wait (Espacio libre) */
sem_oper.sem_num = EL; /* Seleccionamos semáforo Espacio Libre */
sem_oper.sem_op = -1; /* Decrementar 1 (hace un wait) */
sem_oper.sem_flg = SEM_UNDO; /* Para evitar interbloqueos si
un proceso acaba inesperadamente */
semop (semid, &sem_oper, 1);
/* Wait (Manipulación del buffer) */
sem_oper.sem_num = MB;
sem_oper.sem_op = -1;
sem_oper.sem_flg = SEM_UNDO; /* No es necesario porque ya
se ha hecho anteriormente */
semop (semid, &sem_oper, 1);
/* Sección crítica: Para acceder al buffer que será el recurso no compartible */
Aqui viene el código de la sección crítica del productor
/* Signal (Manipulación del buffer) */
sem_oper.sem_num = MB;
sem_oper.sem_op = 1;
semop (semid, &sem_oper, 1);
/* Signal (Elemento Disponible) */
sem_oper.sem_num = ED;
sem_oper.sem_op = 1;
semop (semid, &sem_oper, 1);
} /* fin de for */
/* Separamos la memoria compartida del proceso */
shmdt(addr);
return 0;
} /* fin de main */
Y del 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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/* PROCESO CONSUMIDOR */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <string.h>
#define KEY 100
#define MB 0 // ID del semáforo Manipulación del Buffer
#define EL 1 // ID del semáforo Espacio Libre
#define ED 2 // ID del semáforo Elemento Disponible
#define TAMBUFFER 5 // TAMaño del BUFFER
int main () {
/* Declaración de variables */
int i;
int numContactos; /* número de contactos a visualizar */
int semid; /* ID al conjunto de semáforos */
int shmid; /* ID a la memoria compartida para almacenar el buffer */
struct DatosContacto {
Aquí vienen declarados todos los datos de un contacto
} contacto, *addr; /* contacto se utiliza para almacenar los datos de un contacto */
/* *addr es un puntero a la memoria compartida */
struct sembuf sem_oper; /* Para las operaciones wait y signal con semáforos */
union semun {
int val;
struct semid_ds *semstat;
unsigned short *array;
} arg;
/* Creamos un conjunto de 3 semáforos */
semid=semget(KEY, 3, 0770 | IPC_CREAT);
if (semid == -1) {
printf(“\nError en la creación de los semáforos”);
exit(1); /* Error 1: error en la creación de semáforos */
}
/* Inicializamos los semáforos */
arg.array = (unsigned short *) malloc (sizeof (short)*3);
arg.array[MB] = 1;
arg.array[EL] = TAMBUFFER;
arg.array[ED] = 0;
semctl (semid, 3, SETALL, arg);
/* Crear la memoria compartida */
shmid = shmget(KEY, calcular el tamaño, 0770 | IPC_CREAT);
if (shmid == -1) {
printf(“\nError en la creación de la Memoria compartida”);
exit(2); /* Error 2: error al crear la Memoria compartida */
}
/* Enlazar la memoria compartida al proceso */
addr = shmat(shmid, 0, 0);
/* Determinar el número de contactos a obtener */
Aquí viene el código que determina el número de contactos
/* Repetir para cada contacto obtenido del productor */
for (i=0; i<numContactos; i++) {
/* Wait (Elemento disponible) */
sem_oper.sem_num = ED; /* Seleccionamos semáforo Elemento Disponible */
sem_oper.sem_op = -1; /* Decrementar 1 (hace un wait) */
sem_oper.sem_flg = SEM_UNDO; /* Para evitar interbloqueos si
un proceso acaba inesperadamente */
semop (semid, &sem_oper, 1);
/* Wait (Manipulación del buffer) */
sem_oper.sem_num = MB;
sem_oper.sem_op = -1;
sem_oper.sem_flg = SEM_UNDO; /* No es necesario porque ya
se ha hecho anteriormente */
semop (semid, &sem_oper, 1);
/* Sección crítica: Para acceder al buffer que será el recurso no compartible */
Aqui viene el código de la sección crítica del consumidor
/* Signal (Manipulación del buffer) */
sem_oper.sem_num = MB;
sem_oper.sem_op = 1;
semop (semid, &sem_oper, 1);
/* Signal (Espacio libre) */
sem_oper.sem_num = EL;
sem_oper.sem_op = 1;
semop (semid, &sem_oper, 1);
/* Consumir el elemento */
Aquí viene el código de Consumir el elemento
} /* fin de for */
/* Eliminamos el conjunto de semáforos */
semctl (semid, 3, IPC_RMID, 0);
/* Separamos la memoria compartida del proceso */
shmdt(addr);
/* Eliminamos la memoria compartida */
/* Esta operación lo realiza uno de los procesos */
shmctl(shmid, IPC_RMID, 0);
/* liberamos la memoria dinámica */
free (arg.array);
return 0;
} /* fin de main */
Valora esta pregunta


0