From: Leandro Lucarella Date: Tue, 25 Apr 2006 06:21:03 +0000 (+0000) Subject: 2.3.1 terminado. X-Git-Tag: svn_import~91 X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/commitdiff_plain/671f9ad6c8665fefca79edc0f246f2d6a788136a 2.3.1 terminado. --- diff --git a/practicas/practica2/P02e2311.cpp b/practicas/practica2/P02e2311.cpp new file mode 100644 index 0000000..18d1877 --- /dev/null +++ b/practicas/practica2/P02e2311.cpp @@ -0,0 +1,74 @@ +/** + * Leandro Lucarella (77891) + * + * Ejercicio 2.3.1. Implementa productor-consumidor con pipes. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +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 : diff --git a/practicas/practica2/P02e2311.sh b/practicas/practica2/P02e2311.sh new file mode 100755 index 0000000..684b079 --- /dev/null +++ b/practicas/practica2/P02e2311.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +FIFO=/tmp/77891_P02e2311 + +# Creo named pipe +mkfifo $FIFO + +# Lanzo procesos +./P02e2311 0 $1 & +p0=$! +./P02e2311 1 $1 & +p1=$! + +# Espero que terminen +wait $p0 +wait $p1 + +# Limpio pipe +rm $FIFO diff --git a/practicas/practica2/README b/practicas/practica2/README index e2a4014..cf3cc35 100644 --- a/practicas/practica2/README +++ b/practicas/practica2/README @@ -75,3 +75,16 @@ $ ./P02e2221 0 & ./P02e2221 1 & ./P02e2221 2 & ./P02e2221 3 & ./P02e2221 4 & Se provee un script lanzador: ./P02e2221.sh (recibe un parámetro opcional con la cantidad de iteraciones) +P02e2311 +======== +Ejercicio 2.3.1. Productor-consumidor usando pipes. +Debe coincidir la cantidad de cosas a producir y a consumir, y puede haber solo +un productor (que debe correr primero) y un solo consumidor. +Por ejemplo: +$ ./P02e2311 0 & ./P02e2311 1 & +(tambien acepta un parametro extra para la cantidad de iteraciones, 0 es +productor, 1 es consumidor) + +Se provee un script lanzador: ./P02e2311.sh +(recibe un parámetro opcional con la cantidad de iteraciones) +