可靠地响应信号而死

Die reliably in response to a signal

由于 SIGALRM 的到来,以下代码应该在一段时间后超时 -

sub sig_alrm_handler() { die "Timed out, sorry" }

$SIG{ALRM} = \&sig_alrm_handler;
main();

通常这种方法有效,除了有时 main() 包含一个 Try::Tiny 'try' 块,它从 sig_alrm_handler 拦截 "die",有效地忽略超时。如何更改此方法,以便 SIGALRM 可靠地终止程序,即使 main() 捕获异常?

如果你想结束你的程序,你可以调用exit from your signal function. If you have an END块,它仍然会执行那个。

这是一个代码示例。我用 SIGINT 作为它,但 SIGALRM 的工作方式相同。

#!/usr/bin/perl
use strict;
use warnings;
use Try::Tiny;

sub sig_int_handler() {
#   die "Dying from SIGINT\n";
    warn "Exiting from SIGINT\n";
    exit(128 | 2);   # 2 = SIGINT
};

$SIG{INT} = \&sig_int_handler;
my $i = 0;
try {
    while (1) {

    }
} catch {
    print "caught exception\n";
};

print "continuing execution\n";

在此示例中,如果您在 运行 时点击 ctrl-c,它将退出而不打印两个 print 语句。但是,如果您在 sig_int_handler 子例程中取消注释带有 die 的行,它将在您发送 INT 信号时打印它们。