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

标签 perl module signals

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

相关文章:

database - 具有多个条目的 DBIX 预取有效但会抛出哈希错误,有没有办法解决这个问题?

Bash 配置文件从 Perl 脚本获取时抛出错误

Python 模块范围

ruby - Thread#terminate 和处理 SIGTERM

perl - 循环遍历数组以使用 Perl 比较两个值

multithreading - Perl 线程和散列键

module - 为什么 Rust 中有 mod 关键字?

module - 当两个子模块都在同一个主模块中时,从另一个子模块访问子模块

c++ - sig_atomic_t 和 std::atomic<> 可以互换吗?

c++ - 如何向另一个线程发出带有数组参数的信号