+/**
+ * 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 :