23 agosto 2007

Un script en Linux para mejorar la memoria y entender la captura de interrupciones con trap

Tengo una memoria de perros. Acostumbrado a lo que estoy, la memoria la he dejado para otro uso, pero ahora no recuerdo para qué... En un momento de lucidez programé un pequeño script para Bash que pregunta números continuamente. Podéis echarle un ojo y usarlo si quereis. Solo hay que seguir estos pasos básicos:
  1. Guardarlo en un fichero de texto (como ejemplo lo llamamos memo)
  2. Dar permisos de ejecución con chmod +x memo
  3. Ejecutar desde la consola con ./memo
Este script escribe en archivos temporales en /tmp y al finalizar el juego, cuando pierdes, todos los ficheros se borran. ¿Pero qué pasa si abortamos el juego con Control+C? El programa no llegaría al final y los ficheros quedarían sin borrar.

Las interrupciones en bash se capturan con trap, siendo la nomenclatura:

trap funcion_que_gestiona codigo_interrupcion

El código de excepción para la interrupción del programa con Control+C es el 2. El cuelgue tiene como código el 1 y cuando matamos el proceso salta con 9, pero esta última interrupción no puede ser manejada.

El código del juego está aquí. El texto en rojo pertenece a la gestión del Control+C. La función que elimina los archivos temporales se llama elimina_temporales() y la captura de la interrupción se realiza al final del código con trap. ¿Os atrevéis? ¿Cómo estáis de memoria? Por cierto, perdonad que todo código este sin tabular pero Blogger me da quebraderos de cabeza en ese sentido.

# Memorizacion, por Joaquin Arias

# -----------------
# Gestion de Ctrl+C
# -----------------

elimina_temporales()
{
if test -f /tmp/memo1
then
rm /tmp/memo1
fi

if test -f /tmp/memo2
then
rm /tmp/memo2
fi

if test -f /tmp/memo3
then
rm /tmp/memo3
fi

echo
echo "Programa abortado"
echo

exit 0
}

# ----------------
# Nucleo del juego
# ----------------

main()
{

#Inicializamos valores
clear
seguir=1
memorizados=0

while [ $seguir -eq 1 ]
do
# Muestro los valores que ya he superado

if test -f /tmp/memo1
then
cat /tmp/memo1
fi

# Muestro otro valor aleatorioa

aleatorio=`expr $RANDOM % 10`
echo -e "$aleatorio \c"
echo -e "$aleatorio \c" >> /tmp/memo1
echo -e "$aleatorio\c" >> /tmp/memo2

echo -e "\n\nPulse Enter cuando haya memorizado..."
read

# Pedimos los valores memorizados
clear
echo -e "Introduzca los valores sin espacios en blanco...\n"
read valoresMemorizados
echo -e "$valoresMemorizados\c" > /tmp/memo3

# Comprobamos si los ficheros son iguales

cmp -s /tmp/memo2 /tmp/memo3
if [ $? -eq 0 ]
then
clear
memorizados=`expr $memorizados + 1`
else
echo -e "\nUps, se equivoco. Consiguio memorizar $memorizados valores.\n"
cat /tmp/memo2
echo
cat /tmp/memo3
echo
echo
rm /tmp/memo1 /tmp/memo2 /tmp/memo3
seguir=0
fi
done

echo $memorizados >> /tmp/memorecord
echo "El record actual es..."
cat /tmp/memorecord | sort -r -n | head -n 1
echo

}


# Llamada a la gestion de Ctrl+C

trap elimina_temporales 2

#
# Llamada a inicio del programa
#

main

No hay comentarios: