%SIG
contiene las rutinas de manipulación de las señales.
las claves del hash son los nombres de las señales. Así, $SIG{INT}$
contendrá el nombre de la subrutina que se ejecuta cuando se produce una interrupciónd e teclado
(el usuario pulsó CTRL-C
).
Supongamos que tenemos un programa que crea ciertos ficheros temporales
durante su ejecución, los cuales son borrados al final de la misma.
Si el usuario pulsa CTRL-C
, nuestro programa será interrumpido y los ficheros
temporales quedarán como restos de la ejecución inacabada. El problema se
resuelve usando un manejador de la señal de interrupción:
> cat signal.pl #!/usr/bin/perl -w use strict; my $temp_dir = "/tmp/signal.$$"; mkdir $temp_dir, 0700 or die "No se pudo crear $temp_dir: $!"; sub clean_files { unlink glob "$temp_dir/*"; rmdir $temp_dir; } sub int_handler { &clean_files; die "\nPrograma interrumpido por el usuario\n"; } $SIG{INT} = 'int_handler'; my $fn = "$temp_dir/file.txt"; open(F, ">$fn"); my $n = shift or 1; my @files; my $i = 0; while ($i < $n) { print F "$i\n"; $i++; @files = </tmp/* $temp_dir/*>; $" = "\n"; print STDOUT "@files"; } close(F); &clean_files;Veamos un ejemplo de ejecución:
> signal.pl 100000 /tmp/Acromj4rS5 /tmp/gv_406924cc_1_contratacion.pdf.tmp /tmp/kde-pp2 /tmp/ksocket-pp2 /tmp/mcop-pp2 /tmp/pico.000835.bak /tmp/session_mm_apache0.sem /tmp/signal.7247 /tmp/ssh-XXugMPij /tmp/v562119 ... <CTRL-C> Programa interrumpido por el usuario > ls -ltr /tmp total 32 drwx------ 2 pp2 pp2 4096 Mar 29 08:07 ssh-XXugMPij drwx------ 3 pp2 pp2 4096 Mar 29 08:08 mcop-pp2 drwx------ 2 pp2 pp2 4096 Mar 29 08:08 ksocket-pp2 drwx------ 2 pp2 pp2 4096 Mar 29 08:11 kde-pp2 drwx------ 2 casiano casiano 4096 Mar 29 13:12 v562291 -rw------- 1 root root 0 Mar 30 06:29 session_mm_apache0.sem -rw-r--r-- 1 casiano casiano 705 Mar 30 08:42 gv_406924cc_1_contratacion.pdf.tmp drwx------ 2 casiano casiano 4096 Mar 30 08:47 v562119 -rw-r--r-- 1 casiano casiano 0 Mar 30 10:00 Acromj4rS5 -rw------- 1 casiano casiano 2397 Mar 30 11:15 pico.000835.bak