为什么脚本终止时不调用对象析构函数?

时间:2010-04-13 11:19:16

标签: perl signals destroy

我有一个这样的测试脚本:

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

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

sleep返回后(在程序终止之前)调用析构函数。但是如果脚本以Ctrl-C终止,则不会调用它。是否有可能在这种情况下调用析构函数?

2 个答案:

答案 0 :(得分:7)

作为罗伯特mentioned,你需要一个信号处理程序 如果您只需要对象析构函数调用,则可以使用:

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

答案 1 :(得分:6)

您必须设置信号处理程序。

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;
}

这些方面的东西。然后在主循环中,检查$terminate,如果设置正常,则退出程序。

cntl-c中断睡眠,信号处理程序调用设置$terminate,睡眠立即返回,循环返回顶部,测试$terminate并正常退出。