2010-04-13 17 views
7

Ho uno script di test come questo:Perché il distruttore di oggetti non viene chiamato quando termina lo script?

package Test; 
sub new { bless {} } 
sub DESTROY { print "in DESTROY\n" } 

package main; 
my $t = new Test; 
sleep 10; 

Il distruttore viene chiamato dopo sleep rendimenti (e prima che il programma termina). Ma non viene chiamato se lo script è terminato con Ctrl-C. È possibile avere anche il distruttore chiamato in questo caso?

risposta

6

Dovrai impostare un gestore di segnale.

package Test; 
sub new { bless {} } 
sub DESTROY { print "in DESTROY\n" } 

package main; 

my $terminate = 0; 

$SIG{INT} = \&sigint; 

sub sigint { $terminate = 1; } 

my $t = new Test; 

while (1) { 
    last if $terminate; 
    sleep 10; 
} 

Qualcosa in questo senso. Quindi nel tuo ciclo principale controlla semplicemente $terminate e se è impostato esci normalmente dal programma.

Quello che succede è che il cntl-c interrompe il sonno, il gestore di segnale viene chiamato impostando $terminate, il sonno ritorna immediatamente, scorre verso l'alto, prova $terminate ed esce graziosamente.

7

Come Robert mentioned, è necessario un gestore di segnale.
Se tutto ciò che serve è la chiamata al distruttore di oggetti, è possibile utilizzare questo:

$SIG{INT} = sub { die "caught SIGINT\n" };.

Problemi correlati