在我的模块的 BEGIN 部分中包含以下内容:
use sigtrap qw(handler shutdown normal-signals);
use sigtrap qw(die untrapped normal-signals stack-trace any error-signals);
但是当 sigtrap 捕捉到 INT 等时,我在 shutdown sub 中得到的只包含陷阱而不包含对象句柄。没有 $self.
sub shutdown {
my $sig = shift || 'Nothing';
print "Got signal: $sig\n";
exit;
}
简单的返回
Got signal: INT
在此之后我的 DESTROY get 被及时调用并且可以访问对象句柄,但是因为我在关闭时无法访问句柄,所以我无法存储它并且不知道信号是什么。
我需要知道我遇到了什么陷阱,以便我的 DESTROY 方法可以记录导致关机的原因。
也许 sigtrap 不是这里的最佳选择。欢迎提出意见。
最佳答案
我检查了sigtrap
, 它不是专门的 OO 模块,如果你想将它作为一个模块使用,你可能需要使用 闭包 而不是对象方法。
所以你可以这样定义你的类:
package SigHandler;
sub new {
my $class = shift;
return bless { @_ }, $class;
}
sub on_signal_int {
my $self = shift;
...
}
sub get_handler {
my $self = shift;
my @other_args = shift;
...
return sub {
my $sig = shift;
if ( $sig == INT ) {
return $self->on_signal_int();
}
};
}
然后像这样调用它:
use handler => SigHandler->new->get_handler, 'normal-signals';
关于perl - 在 perl 模块中使用 sigtrap,如何在对象上下文中接收到陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7652744/