gpt4 book ai didi

perl - 在 perl 模块中使用 sigtrap,如何在对象上下文中接收到陷阱?

转载 作者:行者123 更新时间:2023-12-02 07:45:03 24 4
gpt4 key购买 nike

在我的模块的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com