【发布时间】:2015-04-10 07:00:53
【问题描述】:
我有这段代码可以让一个长时间运行的进程超时(在这种情况下为sleep):
#!/usr/bin/env perl
use strict;
use warnings;
die "Usage: $0 SLEEP TIMEOUT\n" unless @ARGV == 2;
my ( $sleep, $timeout ) = @ARGV;
$|++;
eval {
local $SIG{ALRM} = sub { die "TIMEOUT\n" };
alarm $timeout;
eval {
# long-running process
print "Going to sleep ... ";
sleep $sleep;
print "DONE\n";
};
alarm 0; # cancel timeout
};
die $@ if $@;
当我以./alarm 5 2 运行它时,我希望它会die 说“超时”。但是它以 0 退出并且什么也没说。当我删除内部eval 块(不是块的内容,只是eval)时,它按预期工作。有人可以解释这是为什么吗?谢谢。
【问题讨论】:
-
perldoc -f alarm:混用“alarm”和“sleep”调用通常是错误的,因为“sleep”可能在您的系统内部与“alarm”一起实现。
-
混用 "alarm" 和 :"sleep" 调用很少会出错,因为在内部实现 "sleep" 和 "alarm" 的系统并不常见,而且越来越多。
标签: perl