Enunciado.
La práctica constará de un solo programa ejecutable
gas
procedente de la compilación de un programa
fuente en C, gas.c
.
El programa creará una tubería con nombre
delfos
y situada en el directorio desde
donde se lance el programa. También declarará una zona
privada de memoria compartida capaz de contener el array:
char *campo="\
XXXXXXXXXXXXXXXXXXX\n\
X X\n\
X X\n\
X X\n\
X X\n\
X X\n\
X X\n\
X X\n\
X X\n\
X X\n\
X X\n\
XXXXXXXXXXXXXXXXXXX\n\
";
El proceso padre realizará dos tareas de un modo simultáneo:
- Cada cierto tiempo (que se indicará en la línea de
órdenes), moverá el cursor a la posición de HOME
(no usar para ello
system
, suponed un
terminal VT-100) e imprimirá la cadena contenida en
la zona de memoria compartida.
- Atenderá de un modo inmediato cualquier orden que
le llegue por la tubería y actuará en consecuencia.
Las órdenes que le pueden llegar son:
bola
: creará un nuevo proceso
que moverá una bola en la simulación, inicialmente
en el centro de la pantalla y con velocidad
hacia el SE.
parar
: parará, si es que no lo
están, a todas la bolas de la simulación,
mediante una señal.
seguir
: hará que las bolas
continúen en su ejecución si es que estaban
paradas, mediante una señal.
salir
: saldrá de una manera limpia
del programa (eliminando todos los recursos y
no dejando ningún proceso en ejecución).
En cuanto a los procesos bola, se moverán en diagonal con
un intervalo de avance del doble que el intervalo de refresco
de pantalla. Comenzarán moviéndose hacia el SE (sudeste),
pudiendo variar su rumbo dependiendo de si se encuentran
con una pared (marcada con una X
u otra bola,
marcada con una O
). El algoritmo es muy sencillo:
Suponiendo (x,y) la posición de la bola y (vx,vy) su velocidad
(que sólo puede tomar los valores (1,1):SE, (1,-1):NE,
(-1,1):SW y (-1,-1):NW), el algoritmo es:
dormir;
choque=false;
si (x+vx,y) está ocupado, vx=-vx y choque=true
si (x,y+vy) está ocupado, vy=-vy y choque=true
si no se ha producido choque hasta ahora y (x+vx,y+vy) está ocupado,
vx=-vx, vy=-vy y choque=true
si no se ha producido choque, borrar la bola, x=x+vx e y=y+vy, pintar la bola
El programa admitirá un parámetro en la línea de órdenes
de tipo entero que indicará cuál será el intervalo entre
refrescos de pantalla, expresado en décimas de segundo,
con posibilidad de que se extienda más allá del segundo.
Ningún proceso debe consumir CPU de un modo innecesario ni
realizar esperas ocupadas ni semiocupadas. Para lograr que
el programa duerma intervalos inferiores al segundo (e
incluso pueda atender a la tubería en el caso del
proceso padre, usad multiplexión de entrada/salida
síncrona). Para conseguir parar a todas las bolas de golpe,
es mejor usar las funciones de grupo de procesos que
se vieron en la sesión novena.
Aunque en el enunciado no se habla nada acerca de sincronización,
pensad en que seguro que es necesario añadir alguna y que sin
ella, la práctica está mal. Defectos de mala sincronización son
la desaparición temporal de una bola, que las bolas se
atraviesen sin chocar, etc. Considerad, no obstante, que el
hecho de que no se produzcan estos efectos no significa que la
práctica esté bien sincronizada.
Cuando el programa finalice, sea por el motivo que sea,
debe limpiar los recursos utilizados, tanto los recursos
IPC como la tubería con nombre.