【发布时间】:2010-04-13 11:19:15
【问题描述】:
我有一个这样的测试脚本:
package Test;
sub new { bless {} }
sub DESTROY { print "in DESTROY\n" }
package main;
my $t = new Test;
sleep 10;
在sleep 返回之后(以及在程序终止之前)调用析构函数。但如果脚本以 Ctrl-C 终止,则不会调用它。在这种情况下是否也可以调用析构函数?
【问题讨论】:
我有一个这样的测试脚本:
package Test;
sub new { bless {} }
sub DESTROY { print "in DESTROY\n" }
package main;
my $t = new Test;
sleep 10;
在sleep 返回之后(以及在程序终止之前)调用析构函数。但如果脚本以 Ctrl-C 终止,则不会调用它。在这种情况下是否也可以调用析构函数?
【问题讨论】:
作为 Robert mentioned,您需要一个信号处理程序。
如果你只需要对象析构函数调用,你可以使用这个:
$SIG{INT} = sub { die "caught SIGINT\n" };.
【讨论】:
您必须设置一个信号处理程序。
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中断了sleep,信号处理程序被称为设置$terminate,sleep立即返回,它循环到顶部,测试$terminate并优雅地退出。
【讨论】: