7

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

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

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

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

4

2 回答 2

7

正如罗伯特所提到的,您需要一个信号处理程序。
如果您只需要对象析构函数调用,则可以使用:

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

于 2010-04-13T11:53:45.500 回答
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并优雅地退出。

于 2010-04-13T11:21:01.927 回答