trap

El comando trap se usa para especificar las acciones a realizar cuando se reciban las señales, que estudiaremos más adelante en este capítulo. Se suele emplear para ordenar un script cuando éste es interrumpido- Tradicionalmente, las shells siempre usaban un número para las señales, pero los scripts nuevos usan nombres que toman del archivo #include signal.h, con el prefijo SIG omitido. Para ver los números de señal y los nombres asociados, puede escribir trap -l en un incitador de comandos.

ejemplo_trap

nota_trap

Al comando trap se le transmite la acción que hay que falsificar, seguido del nombre de la señal (o de los nombres) que hay que retener:

trap_ejemplo2

Recuerde que los scripts se suelen interpretar desde el principio hasta el final, por eso debe especificar el comando trap antes de la parte del script que desea proteger.

Para restablecer una condición trampa, sólo tiene que especificar el comando como -. Para ignorar una señal, establezca el comando como una cadena vacía ' '. Un comando trap sin parámetros imprime la lista actual de trampas y acciones.

trap_ejemplo3Veamos la siguiente tabla que enumera las señales más importantes que contiene el estándar X/Open y que se puede atrapar (con el número de señal convencional entre paréntesis). Podemos obtener más información en el manual online de las páginas de consulta signal (man 7 signal)

señales_tablaSeñales

El siguiente script presenta una gestión de señal sencilla:

ejemplo_trap_scriptSi ejecutamos este script, mantenga presionado la tecla CTRL y presione después la tecla C en cada uno de los bucles y obtendrá el siguiente resultado:

bucle_trapCómo funciona

Este script usa el comando trap para solicitar que se ejecute el comando rm -f /tmp/my_file_$$ cuando tenga lugar una señal INT (interrupción). Después, el script introduce un bucle while que continua mientras exista el archivo. Cuando el usuario presiona CTRL-C, la sentencia rm /tmp/my_tmp_file_$$ se ejecuta, y después reanuda el bucle while. Como el archivo ha sido eliminado, el primer bucle while termina sin problemas.

Posteriormente, el script usa de nuevo el comando trap, esta vez para especificar que cuando tenga lugar una señal INT no se ejecute ningún comando. Después recrea el archivo y hace un bucle dentro de la segunda sentencia while. Esta vez, cuando el usuario presione CTRL-C, como no se ha configurado ninguna sentencia para que se ejecute, tendrá lugar el comportamiento predeterminado que finalizará de manera inmediata el script. Como el script finaliza de manera inmediata, las sentencias finales echo y exit no se ejecutará nunca.

Anuncios

Una respuesta a trap

  1. no entiendo para que es la segunda parte de tu script, desde la línea de trap INT. En tu ejemplo de la salida sólo aparece trap [-lp] [[arg] id_señal …]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s