next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Controlando errores en tiempo Sup: Señales Ant: Envío de señales Err: Si hallas una errata ...

Captura de señales

El hash %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


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Controlando errores en tiempo Sup: Señales Ant: Envío de señales Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21