可靠地响应信号而死
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
信号时打印它们。
由于 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
信号时打印它们。