如何知道收到信号时正在执行哪一行代码

时间:2017-02-09 15:10:58

标签: perl interrupt perl5

我正在尝试做这样的事情

$SIG{ALRM} = sub {
    print $line_number_when_alarm_went_off;
};

alarm 10;

# rest of the script

我使用ALRM作为示例,我将最终使用不同的信号从外部杀死以触发它。有没有一种巧妙的方法来进行这种操作?

我有一些缓慢的脚本,有时我想向他们发送一个信号,以了解当时代码的位置。

我希望尽可能不引人注目,这样我就可以将其打包并添加到遗留代码中。

1 个答案:

答案 0 :(得分:7)

您可以在列表上下文中使用caller来获取当前子调用的位置的包,文件和行号。

$SIG{ALRM} = sub {
    my ($pkg, $file, $line) = caller;

    CORE::say $line;
    die;
};

alarm 2;

while (1) {
    1;
}

这将输出11(如果我计算正确,在我的文件中它是1740,而$SIG行是1730。

它也可以与其他信号处理程序一起使用,例如warn

$SIG{__WARN__} = sub {
    my ($pkg, $file, $line) = caller;

    CORE::say $line;
};

warn 'foo';

这将输出7

请注意,您的代码存在语法错误。您正在将哈希引用指定为信号处理程序,不是子引用