从如何为Perl系统调用指定超时限制?
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
$nread = sysread SOCKET, $buffer, $size;
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
# timed out
}
else {
# didn't
}
Run Code Online (Sandbox Code Playgroud)
如果发生超时,应该sub { die "alarm\n" }; 导致进程结束.我想我无法理解die.这个http://www.cs.cf.ac.uk/Dave/PERL/node111.html说"die()函数用于退出脚本并显示一条消息供用户阅读".但是,对于上面的脚本,脚本将处理#timed out中的代码.sysread继续工作.我有一个睡眠时间为30秒的perl脚本,而不是sysread.我的超时设置为10秒.正如预期的那样,执行#timed out中的代码,但脚本继续睡眠.任何输入都被赞赏
ike*_*ami 10
die 不会导致进程结束,它会抛出异常.
现在,如果没有捕获异常,那就结束了一个进程,但是你有代码来捕获这个异常.
该过程不会结束,因为您明确阻止它结束.
由于您不太了解自己的行为,可能还有另一种可能性:您使用的是Perl的Windows版本.
这alarm是一个Unix系统调用.它的目的(在经过一定时间后发送信号)在Windows上没有任何意义,因为Windows没有信号.
Perl alarm在某种程度上模仿,但只是以非常有限的方式.sleep很可能是唯一可以中断的操作alarm.否则,仅在语句之间检查超时.
因此它不会中断sysread,但一旦sysread返回,Perl会注意到超时到期并然后模拟信号.
| 归档时间: |
|
| 查看次数: |
4421 次 |
| 最近记录: |