]> git.llucax.com Git - z.facultad/75.74/practicos.git/commitdiff
2.3.1 terminado.
authorLeandro Lucarella <llucax@gmail.com>
Tue, 25 Apr 2006 06:21:03 +0000 (06:21 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Tue, 25 Apr 2006 06:21:03 +0000 (06:21 +0000)
practicas/practica2/P02e2311.cpp [new file with mode: 0644]
practicas/practica2/P02e2311.sh [new file with mode: 0755]
practicas/practica2/README

diff --git a/practicas/practica2/P02e2311.cpp b/practicas/practica2/P02e2311.cpp
new file mode 100644 (file)
index 0000000..18d1877
--- /dev/null
@@ -0,0 +1,74 @@
+/**
+ * Leandro Lucarella (77891)
+ *
+ * Ejercicio 2.3.1. Implementa productor-consumidor con pipes.
+ */
+
+#include <iostream>
+#include <cstdlib>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/wait.h>
+
+using std::cerr;
+using std::cout;
+using std::endl;
+
+// Nombre del pipe
+#define PIPE "/tmp/77891_P02e2311"
+
+// Prueba que un valor no sea -1, saliendo con error si es así.
+#define TEST(v) do { if ((v) == -1) { perror("P02e2221"); exit(200); } } while (0)
+
+/// Nombres de los procesos
+enum proc_t { PRODUCTOR, CONSUMIDOR };
+
+void producir(int pipe)
+{
+    int val = rand();
+    TEST(write(pipe, &val, sizeof(int)));
+    cout << "Producido " << (int)val << endl;
+}
+
+void consumir(int pipe)
+{
+    int val;
+    TEST(read(pipe, &val, sizeof(int)));
+    cout << "Consumido " << val << endl;
+}
+
+int main(int argc, char *argv[])
+{
+    srand(getpid());
+
+    if (argc < 2)
+    {
+        cerr << "Faltan parametros: " << argv[0] << " N [max_iter]\n";
+        return 1;
+    }
+    proc_t proc = (proc_t) atoi(argv[1]);
+
+    // Maxima cantidad de iteraciones (puede venir por parametro)
+    int max_iter = 10;
+    if (argc > 2)
+        max_iter = atoi(argv[2]);
+
+    int mode = (proc == CONSUMIDOR) ? O_RDONLY : O_WRONLY;
+    int pipe = open(PIPE, mode);
+    TEST(pipe);
+    for (int i = 0; i < max_iter; ++i)
+    {
+        if (proc == PRODUCTOR)
+            producir(pipe);
+        else
+            consumir(pipe);
+        sched_yield();
+    }
+
+    return 0;
+}
+
+// vim: set et sw=4 sts=4 :
diff --git a/practicas/practica2/P02e2311.sh b/practicas/practica2/P02e2311.sh
new file mode 100755 (executable)
index 0000000..684b079
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+FIFO=/tmp/77891_P02e2311
+
+# Creo named pipe
+mkfifo $FIFO
+
+# Lanzo procesos
+./P02e2311 0 $1 &
+p0=$!
+./P02e2311 1 $1 &
+p1=$!
+
+# Espero que terminen
+wait $p0
+wait $p1
+
+# Limpio pipe
+rm $FIFO
index e2a4014bdfaa3a15ffe0e1727b10a6b24b0679ed..cf3cc35977ba7dcdc8c379e67ebd99791ee94b09 100644 (file)
@@ -75,3 +75,16 @@ $ ./P02e2221 0 & ./P02e2221 1 & ./P02e2221 2 & ./P02e2221 3 & ./P02e2221 4 &
 Se provee un script lanzador: ./P02e2221.sh
 (recibe un parámetro opcional con la cantidad de iteraciones)
 
 Se provee un script lanzador: ./P02e2221.sh
 (recibe un parámetro opcional con la cantidad de iteraciones)
 
+P02e2311
+========
+Ejercicio 2.3.1. Productor-consumidor usando pipes.
+Debe coincidir la cantidad de cosas a producir y a consumir, y puede haber solo
+un productor (que debe correr primero) y un solo consumidor.
+Por ejemplo:
+$ ./P02e2311 0 & ./P02e2311 1 &
+(tambien acepta un parametro extra para la cantidad de iteraciones, 0 es
+productor, 1 es consumidor)
+
+Se provee un script lanzador: ./P02e2311.sh
+(recibe un parámetro opcional con la cantidad de iteraciones)
+