--- /dev/null
+/**
+ * Leandro Lucarella (77891)
+ *
+ * Ejercicio 2.3.2. Implementa productor-consumidor con pipes, con 3
+ * productores que producen 1/3 cada uno y 2 consumidores que consumen todo.
+ */
+
+#include <iostream>
+#include <sstream>
+#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;
+using std::ostringstream;
+
+// Nombre base del pipe
+#define PIPE_BASE "/tmp/77891_P02e2321_"
+
+/// Nombres de los procesos
+enum proc_t { PRODUCTOR1, PRODUCTOR2, PRODUCTOR3, CONSUMIDOR1, CONSUMIDOR2 };
+
+#define TEST(v) do { if ((v) == -1) { perror("P02e2221"); exit(200); } } while (0)
+
+void producir(int pipes[], int parte)
+{
+ int val = rand();
+ TEST(write(pipes[0], &val, sizeof(int)));
+ TEST(write(pipes[1], &val, sizeof(int)));
+ cout << "Producida parte " << parte << ": " << (int)val << endl;
+}
+
+void consumir(int pipes[], int consumidor)
+{
+ int completo[3];
+ TEST(read(pipes[0], &completo[0], sizeof(int)));
+ TEST(read(pipes[1], &completo[1], sizeof(int)));
+ TEST(read(pipes[2], &completo[2], sizeof(int)));
+ cout << "Consumidor " << consumidor << " consumió: " << completo[0] << ","
+ << completo[1] << "," << completo[2] << 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]);
+
+ // Abro pipes según corresponda
+ int pipes[3];
+ if (proc <= PRODUCTOR3) // Productores
+ {
+ ostringstream oss;
+ oss << PIPE_BASE << proc << "_0";
+ pipes[0] = open(oss.str().c_str(), O_WRONLY);
+ TEST(pipes[0]);
+ oss.str("");
+ oss << PIPE_BASE << proc << "_1";
+ pipes[1] = open(oss.str().c_str(), O_WRONLY);
+ TEST(pipes[1]);
+ }
+ else // Consumidores
+ {
+ int consumidor = proc-3;
+ ostringstream oss;
+ oss << PIPE_BASE << "0_" << consumidor;
+ pipes[0] = open(oss.str().c_str(), O_RDONLY);
+ TEST(pipes[0]);
+ oss.str("");
+ oss << PIPE_BASE << "1_" << consumidor;
+ pipes[1] = open(oss.str().c_str(), O_RDONLY);
+ TEST(pipes[1]);
+ oss.str("");
+ oss << PIPE_BASE << "2_" << consumidor;
+ pipes[2] = open(oss.str().c_str(), O_RDONLY);
+ TEST(pipes[2]);
+ }
+
+ for (int i = 0; i < max_iter; ++i)
+ {
+ if (proc <= PRODUCTOR3)
+ producir(pipes, proc);
+ else
+ consumir(pipes, proc-3);
+ sched_yield();
+ }
+
+ return 0;
+}
+
+// vim: set et sw=4 sts=4 :
Se provee un script lanzador: ./P02e2311.sh
(recibe un parámetro opcional con la cantidad de iteraciones)
+P02e2321
+========
+Ejercicio 2.3.2. Productor-consumidor usando pipes pero con 3 productores
+que producen parcialmente y 2 consumidores que consumen todo. Debe correr
+primero el primer productor porque inicializa las estructuras compartidas.
+Por ejemplo:
+$ ./P02e2321 0 & ./P02e2321 1 & ./P02e2321 2 & ./P02e2321 3 & ./P02e2321 4 &
+(el proceso 0 a 2 son productores, el 3 y 4 consumidores).
+
+Se provee un script lanzador: ./P02e2321.sh
+(recibe un parámetro opcional con la cantidad de iteraciones)
+