perl - 为什么在警报信号处理程序中没有死亡杀死进程?

标签 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 
} 

如果发生超时,应该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 中的代码已执行,但脚本继续休眠。感谢任何输入

最佳答案

die 不会导致进程结束,它会引发异常。

现在,如果没有捕获异常,则结束进程,但是您有 code到位捕获这个异常。

该过程不会结束,因为您明确阻止它结束。

由于您不太清楚自己得到了什么行为,因此可能存在另一种可能性:您使用的是 Windows 版本的 Perl。
alarm是一个Unix系统调用。因为 Windows 没有信号,所以它的目的(在经过一定时间后发送信号)在 Windows 上没有意义。

Perl 模拟 alarm在一定程度上,但只是以非常有限的方式。 sleep很可能是唯一可以被 alarm 中断的操作.否则,仅在语句之间检查超时。

所以它不会中断 sysread ,但一次 sysread返回,Perl 注意到超时到期并模拟信号。

关于perl - 为什么在警报信号处理程序中没有死亡杀死进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10204637/

相关文章:

json - 使用 WWW::Mechanize 将 JSON 消息发送到服务器

linux - 在 initramfs 中使用 perl 重定向系统调用的输出

perl - 我如何找出几周前的日期?

php - 在 PHP 脚本中处理错误并继续执行

java - 随机骰子模拟器

linux - 我可以在 Linux 上识别正在进行的 Web 请求吗?

perl - 如何使用 Perl 将本地时间转换为 YYYY-MM-DD

php - register_shutdown_function() 和 die()

PHP $_SESSION-脚本之间的比较