+/**
+ * Leandro Lucarella (77891)
+ *
+ * Ejercicio 2.2.1. Implementa productor-consumidor con colas.
+ */
+
+#include <iostream>
+#include <cstdlib>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+
+using std::cerr;
+using std::cout;
+using std::endl;
+
+/// Clave de nuestro segmento shm y semaforo
+#define MSG_KEY 0x77891225
+
+void msgbuf_init(msgbuf* m, char val)
+{
+ m->mtype = 1;
+ m->mtext[0] = val;
+}
+
+void msgbuf_set(msgbuf* m, char val)
+{
+ m->mtext[0] = val;
+}
+
+char msgbuf_get(msgbuf* m)
+{
+ return m->mtext[0];
+}
+
+/// Nombres de los procesos
+enum proc_t { PRODUCTOR, CONSUMIDOR };
+
+void producir(int que_id)
+{
+ char val = rand();
+ msgbuf msg;
+ msgbuf_init(&msg, val);
+ msgsnd(que_id, &msg, 1, 0);
+ cout << "Producido " << (int)val << endl;
+}
+
+void consumir(int que_id)
+{
+ msgbuf msg;
+ msgrcv(que_id, &msg, 1, 1, 0);
+ cout << "Consumido " << (int)msg.mtext[0] << endl;
+}
+
+int main(int argc, char *argv[])
+{
+ if (argc < 2)
+ {
+ cerr << "Faltan parametros: " << argv[0] << " N [max_iter]\n";
+ return 1;
+ }
+ proc_t proc = (proc_t) atoi(argv[1]);
+
+ // Cola
+ int que_id;
+ do
+ {
+ // crea solo si es el proceso 0
+ que_id = msgget(MSG_KEY, (proc ? 0 : IPC_CREAT) | 0666);
+ }
+ while (proc == CONSUMIDOR && que_id == -1);
+
+ srand(getpid());
+
+ // Maxima cantidad de iteraciones (puede venir por parametro)
+ int max_iter = 10;
+ if (argc > 2)
+ max_iter = atoi(argv[2]);
+
+ // Loop principal
+ for (int i = 0; i < max_iter; ++i)
+ {
+ if (proc == PRODUCTOR)
+ producir(que_id);
+ else
+ consumir(que_id);
+ //sched_yield(); // Para que se entrelacen mejor
+ }
+
+ return 0;
+}
+
+// vim: set et sw=4 sts=4 :