2 * Leandro Lucarella (77891)
4 * Ejercicio 2.3.2. Implementa productor-consumidor con pipes, con 3
5 * productores que producen 1/3 cada uno y 2 consumidores que consumen todo.
13 #include <sys/types.h>
20 using std::ostringstream;
22 // Nombre base del pipe
23 #define PIPE_BASE "/tmp/77891_P02e2321_"
25 /// Nombres de los procesos
26 enum proc_t { PRODUCTOR1, PRODUCTOR2, PRODUCTOR3, CONSUMIDOR1, CONSUMIDOR2 };
28 #define TEST(v) do { if ((v) == -1) { perror("P02e2221"); exit(200); } } while (0)
30 void producir(int pipes[], int parte)
33 TEST(write(pipes[0], &val, sizeof(int)));
34 TEST(write(pipes[1], &val, sizeof(int)));
35 cout << "Producida parte " << parte << ": " << (int)val << endl;
38 void consumir(int pipes[], int consumidor)
41 TEST(read(pipes[0], &completo[0], sizeof(int)));
42 TEST(read(pipes[1], &completo[1], sizeof(int)));
43 TEST(read(pipes[2], &completo[2], sizeof(int)));
44 cout << "Consumidor " << consumidor << " consumió: " << completo[0] << ","
45 << completo[1] << "," << completo[2] << endl;
48 int main(int argc, char *argv[])
54 cerr << "Faltan parametros: " << argv[0] << " N [max_iter]\n";
57 proc_t proc = (proc_t) atoi(argv[1]);
59 // Maxima cantidad de iteraciones (puede venir por parametro)
62 max_iter = atoi(argv[2]);
64 // Abro pipes según corresponda
66 if (proc <= PRODUCTOR3) // Productores
69 oss << PIPE_BASE << proc << "_0";
70 pipes[0] = open(oss.str().c_str(), O_WRONLY);
73 oss << PIPE_BASE << proc << "_1";
74 pipes[1] = open(oss.str().c_str(), O_WRONLY);
79 int consumidor = proc-3;
81 oss << PIPE_BASE << "0_" << consumidor;
82 pipes[0] = open(oss.str().c_str(), O_RDONLY);
85 oss << PIPE_BASE << "1_" << consumidor;
86 pipes[1] = open(oss.str().c_str(), O_RDONLY);
89 oss << PIPE_BASE << "2_" << consumidor;
90 pipes[2] = open(oss.str().c_str(), O_RDONLY);
94 for (int i = 0; i < max_iter; ++i)
96 if (proc <= PRODUCTOR3)
97 producir(pipes, proc);
99 consumir(pipes, proc-3);
106 // vim: set et sw=4 sts=4 :