gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:42:50 25 4
gpt4 key购买 nike

从如何为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com