]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica2/P02e2311.cpp
Ya estamos fragmentando! (falta testing intensivo pero parece andar)
[z.facultad/75.74/practicos.git] / practicas / practica2 / P02e2311.cpp
1 /**
2  * Leandro Lucarella (77891)
3  *
4  * Ejercicio 2.3.1. Implementa productor-consumidor con pipes.
5  */
6
7 #include <iostream>
8 #include <cstdlib>
9 #include <unistd.h>
10 #include <fcntl.h>
11 #include <sys/errno.h>
12 #include <sys/types.h>
13 #include <sys/ipc.h>
14 #include <sys/wait.h>
15
16 using std::cerr;
17 using std::cout;
18 using std::endl;
19
20 // Nombre del pipe
21 #define PIPE "77891_P02e2311"
22
23 // Prueba que un valor no sea -1, saliendo con error si es así.
24 #define TEST(v) do { if ((v) == -1) { perror("P02e2221"); exit(200); } } while (0)
25
26 /// Nombres de los procesos
27 enum proc_t { PRODUCTOR, CONSUMIDOR };
28
29 void producir(int p)
30 {
31     int val = rand();
32     TEST(write(p, &val, sizeof(int)));
33     cout << "Producido " << (int)val << endl;
34 }
35
36 void consumir(int p)
37 {
38     int val;
39     TEST(read(p, &val, sizeof(int)));
40     cout << "Consumido " << val << endl;
41 }
42
43 int main(int argc, char *argv[])
44 {
45     srand(getpid());
46
47     if (argc < 2)
48     {
49         cerr << "Faltan parametros: " << argv[0] << " N [max_iter]\n";
50         return 1;
51     }
52     proc_t proc = (proc_t) atoi(argv[1]);
53
54     // Maxima cantidad de iteraciones (puede venir por parametro)
55     int max_iter = 10;
56     if (argc > 2)
57         max_iter = atoi(argv[2]);
58
59     int mode = (proc == CONSUMIDOR) ? O_RDONLY : O_WRONLY;
60     int p = open(PIPE, mode);
61     TEST(p);
62     for (int i = 0; i < max_iter; ++i)
63     {
64         if (proc == PRODUCTOR)
65             producir(p);
66         else
67             consumir(p);
68         sched_yield();
69     }
70
71     return 0;
72 }
73
74 // vim: set et sw=4 sts=4 :