]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica2/P02e2211.cpp
Mejora descripcion
[z.facultad/75.74/practicos.git] / practicas / practica2 / P02e2211.cpp
1 /**
2  * Leandro Lucarella (77891)
3  *
4  * Ejercicio 2.2.1. Implementa productor-consumidor con colas de mensajes.
5  */
6
7 #include <iostream>
8 #include <cstdlib>
9 #include <unistd.h>
10 #include <fcntl.h>
11 #include <sys/types.h>
12 #include <sys/ipc.h>
13 #include <sys/msg.h>
14
15 using std::cerr;
16 using std::cout;
17 using std::endl;
18
19 /// Clave de nuestro segmento shm y semaforo
20 #define MSG_KEY 0x77891225
21
22 void msgbuf_init(msgbuf* m, char val)
23 {
24     m->mtype = 1;
25     m->mtext[0] = val;
26 }
27
28 void msgbuf_set(msgbuf* m, char val)
29 {
30     m->mtext[0] = val;
31 }
32
33 char msgbuf_get(msgbuf* m)
34 {
35     return m->mtext[0];
36 }
37
38 /// Nombres de los procesos
39 enum proc_t { PRODUCTOR, CONSUMIDOR };
40
41 void producir(int que_id)
42 {
43     char val = rand();
44     msgbuf msg;
45     msgbuf_init(&msg, val);
46     msgsnd(que_id, &msg, 1, 0);
47     cout << "Producido " << (int)val << endl;
48 }
49
50 void consumir(int que_id)
51 {
52     msgbuf msg;
53     msgrcv(que_id, &msg, 1, 1, 0);
54     cout << "Consumido " << (int)msg.mtext[0] << endl;
55 }
56
57 int main(int argc, char *argv[])
58 {
59     if (argc < 2)
60     {
61         cerr << "Faltan parametros: " << argv[0] << " N [max_iter]\n";
62         return 1;
63     }
64     proc_t proc = (proc_t) atoi(argv[1]);
65
66     // Cola
67     int que_id;
68     do
69     {
70         // crea solo si es el proceso 0
71         que_id = msgget(MSG_KEY, (proc ? 0 : IPC_CREAT) | 0666);
72     }
73     while (proc == CONSUMIDOR && que_id == -1);
74
75     srand(getpid());
76
77     // Maxima cantidad de iteraciones (puede venir por parametro)
78     int max_iter = 10;
79     if (argc > 2)
80         max_iter = atoi(argv[2]);
81
82     // Loop principal
83     for (int i = 0; i < max_iter; ++i)
84     {
85         if (proc == PRODUCTOR)
86             producir(que_id);
87         else
88             consumir(que_id);
89         //sched_yield(); // Para que se entrelacen mejor
90     }
91
92     return 0;
93 }
94
95 // vim: set et sw=4 sts=4 :