【发布时间】:2017-04-02 23:23:16
【问题描述】:
这从 Perl 5.10.1 开始按预期工作:SIGINT 被捕获。
#!/usr/bin/perl
use strict;
use warnings;
$SIG{INT} = sub { die "Caught a sigint $!" };
sleep(20);
但是这里 SIGINT 被困住了。
#!/usr/bin/perl
use strict;
use warnings;
$SIG{INT} = sub { die "Caught a sigint $!" };
END {
sleep(20);
}
这可以通过在END 块中再次设置处理程序来解决,如下所示:
END {
$SIG{INT} = sub { die "Caught a sigint $!" };
sleep(20);
}
但如果你有多个块,那将不起作用:必须为每个块重新设置处理程序。
我试图弄清楚这一点,但在perldoc 找不到解释。我能找到的唯一提到这种行为的是Practical Perl Programming A D Marshall 1999-2005的脚注
注意发送到脚本的信号可以绕过 END 块。
有人能解释一下吗?
【问题讨论】:
-
在 5.24 上工作正常(似乎)。没有时间测试,但是如果您将 sig 处理程序放在 5.10 上的
BEGIN块中会发生什么......这会改变什么吗?我希望并且不认为... -
我在家里用 5.22 再次测试了它,我也有同样的行为。然后启动 Ctrl-C -> Caught...,结束块:
。至于 BEGIN 块,在 5.22 上,将处理程序设置在那里会捕获信号,但也有一个 END 块,信号仍然未被捕获。 -
你个人好像觉得委屈。没有人把你挑出来。 Perl 是一种编程语言,如果您与我们其他信任和尊重该语言但偶尔发现需要修复的错误的人一起,您会更快地得到更好的答案。在这种情况下,
END块禁用信号我并不感到惊讶,否则它可能导致无限循环。您是否要求提供有关 Perl 版本之间更改的文档? -
我应该解释一下,我已将您的问题编辑为不那么尖锐,我的批评与您的原始帖子有关。
-
@gxtaillon:Perl 的创建者 Larry Wall 写道,“Perl 并不迷恋强制隐私。它宁愿你呆在它的客厅之外,因为你不是没有被邀请,不是因为它有猎枪”