2 * Leandro Lucarella (77891)
4 * Ejercicio 2.2.2. Implementa productor-consumidor con colas de mensajes, con 3
5 * productores que producen 1/3 cada uno y 2 consumidores que consumen todo.
12 #include <sys/types.h>
20 /// Clave de nuestro segmento shm y semaforo
21 #define MSG_KEY 0x77891226
23 void msgbuf_init(msgbuf* m, char val, int type)
29 void msgbuf_set_val(msgbuf* m, char val)
34 void msgbuf_set_type(msgbuf* m, char type)
39 char msgbuf_get(msgbuf* m)
44 /// Nombres de los procesos
45 enum proc_t { PRODUCTOR1, PRODUCTOR2, PRODUCTOR3, CONSUMIDOR1, CONSUMIDOR2 };
47 /// Nombres del typo de mensaje según la parte a producir (se produce la misma
48 /// parte 2 veces, una para cada consumidor
49 enum msg_t { PARTE11 = 1, PARTE21, PARTE31, PARTE12, PARTE22, PARTE32 };
51 msg_t msg_types[3][2] =
58 #define TEST(v) do { if ((v) == -1) { perror("P02e2221"); exit(200); } } while (0)
60 void producir(int que_id, int parte)
64 msgbuf_init(&msg, val, msg_types[parte][0]);
65 TEST(msgsnd(que_id, &msg, 1, 0));
67 msgbuf_set_type(&msg, msg_types[parte][1]);
68 TEST(msgsnd(que_id, &msg, 1, 0));
70 cout << "Producida parte " << parte << ": " << (int)val << endl;
74 void consumir(int que_id, int consumidor)
78 TEST(msgrcv(que_id, &msg, 1, msg_types[0][consumidor], 0));
80 completo[0] = msg.mtext[0];
81 TEST(msgrcv(que_id, &msg, 1, msg_types[1][consumidor], 0));
83 completo[1] = msg.mtext[0];
84 TEST(msgrcv(que_id, &msg, 1, msg_types[2][consumidor], 0));
86 completo[2] = msg.mtext[0];
87 cout << "Consumidor " << consumidor << " consumió: " << completo[0] << ","
88 << completo[1] << "," << completo[2] << endl;
92 int main(int argc, char *argv[])
96 cerr << "Faltan parametros: " << argv[0] << " N [max_iter]\n";
99 proc_t proc = (proc_t) atoi(argv[1]);
105 // crea solo si es el proceso 0
106 que_id = msgget(MSG_KEY, (proc ? 0 : IPC_CREAT) | 0666);
108 while (proc != PRODUCTOR1 && que_id == -1);
110 // Maxima cantidad de iteraciones (puede venir por parametro)
113 max_iter = atoi(argv[2]);
118 for (int i = 0; i < max_iter; ++i)
120 if (proc < 3) // productor
121 producir(que_id, proc);
123 consumir(que_id, proc-3);
129 // vim: set et sw=4 sts=4 :