Se trata de hacer un dispositivo /dev/tunnel, que sirva para la sincronización de las tareas que quieren usar un tunel como el de la tarea2. Para ello, el dispositivo debe soportar: open, write (que es como entry) y read (que es como move). El dispositivo debe representar el tunel y los espacios ocupados, de modo de ir bloqueando a las tareas llamadoras en la sincronización.
Para que funcione, se requiere que las tareas sean implementadas por el kernel, por que en ese caso son igual que procesos independientes. Por ello, no se puede ocupar nSystem, y usaremos pthreads llamando a read y write.
Las primitivas a implementar deben funcionar de la siguiente forma:
// entry a tunnel de un item con prior count int write(fd, buf, count); // buf apunta a un int que tiene el numero de item // count es la prioridad con la que se espera entrar // move dentro de tunnel de un item que uso esa prioridad int read(fd, buf, count); // buf apunta a un int que tiene el numero de item // count es un entero con la prioridad // retorna EOF (0) cuando salió del tunel int ioctl(fd, IOC..., arg); // RESET, GETSIZE y SETSIZE
Un programa que resuelve esto usando pthreads se les entrega de ejemplo, usando el device /dev/tunnel y recibiendo de argumentos los autos y el tamaño del tunel. con prioridades se les entrega, y ustedes deben usar ese mismo programa sin modificarlo.
La tarea3 consiste en escribir el código para un módulo cargables que implemente ese driver. El sentido de las prioridades es el mismo de la tarea2.
Se incluye un Makefile y otros archivos para compilarlos en tarea3.tgz, lo que incluye una versión de wish.c modificado para correr con threads y el tunnel.h. Por supuesto, no pueden probar ese programa si no tienen un device /dev/tunnel en su sistema.
Para probar el ejecutable (suponiendo que tienen un /dev/tunnel):
% ./nautos2 200 50 | wish
La tarea debe realizarse en C usando los Makefiles habituales de los drivers. Entreguen todos los archivos, incluido el Makefile.
La tarea debe entregarse antes del plazo final a través de U-cursos
y debe compilar sin errores y
ejecutar, o no será evaluada. Si tienen una tarea que funciona en parte, pero
no completa, entréguenla a tiempo y obtendrán algo de nota. Los ioctl son
lo último a implementar. En el código de ejemplo, se pueden comentar
las líneas con ioctl y usar el tunel de largo default siempre. Cada
función ioctl que implementen les da un poco de puntaje más.