]> git.llucax.com Git - z.facultad/75.74/practicos.git/commitdiff
Ejericio 2.2.1 completo.
authorLeandro Lucarella <llucax@gmail.com>
Mon, 24 Apr 2006 04:58:51 +0000 (04:58 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Mon, 24 Apr 2006 04:58:51 +0000 (04:58 +0000)
practicas/practica2/P02e2211.cpp [new file with mode: 0644]
practicas/practica2/P02e2211.sh [new file with mode: 0755]

diff --git a/practicas/practica2/P02e2211.cpp b/practicas/practica2/P02e2211.cpp
new file mode 100644 (file)
index 0000000..907c781
--- /dev/null
@@ -0,0 +1,95 @@
+/**
+ * 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 :
diff --git a/practicas/practica2/P02e2211.sh b/practicas/practica2/P02e2211.sh
new file mode 100755 (executable)
index 0000000..32c6fc4
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+# Lanzo procesos
+./P02e2211 0 $1 &
+p0=$!
+./P02e2211 1 $1 &
+p1=$!
+
+# Espero que terminen
+wait $p0
+wait $p1
+
+# Limpio IPC
+ipcrm -Q 0x77891225