为什么不在报警信号处理程序中死掉进程?

doo*_*oon 3 perl die

从如何为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会注意到超时到期并然后模拟信号.