Perl是否可以为它收到的所有信号只安装一个信号处理程序?这背后的原因是,我不知道我的Perl代码在运行时会得到什么信号。我能看到的一种方法是将所有可用信号指向我的自定义信号处理程序,但我不想这样做。有没有简单的方法来做到这一点?类似的东西:
$SIG{'ALL'} = 'sigHandler';
答案 0 :(得分:12)
你真的不想这样做。只安装信号处理程序,以便处理您需要处理的信号,而不是默认信号(我们无法帮助您,因为您没有提到您正在编写的应用程序类型)。
在大多数正常情况下,您根本不必编写信号处理程序 - 默认设置为完全符合您的需要。您应该立即阅读perldoc perlipc ,以便了解您的情况与正常情况不同。
您可以使用sigtrap pragma一次修改多个信号:它可以为正常未捕获的信号添加处理程序,或者使正常的错误处理更严格。
# install a trivial handler for all signals, as a learning tool
use sigtrap 'handler' => \&my_handler, 'signal';
sub my_handler
{
print "Caught signal $_[0]!\n";
}
答案 1 :(得分:6)
$SIG{$_} = 'sigHandler' for keys %SIG;
如果您想以不同方式对待__WARN__
和__DIE__
,
use Config;
$SIG{$_} = 'sigHandler' for split ' ', $Config{sig_name};
答案 2 :(得分:3)
脱离我的头顶,
foreach my $key (keys %SIG) {
$SIG{$key} = \&sighandler
}
但这可能是一个坏主意。你应该只捕捉到你知道可以处理的任何信号。不应以相同的方式处理不同的信号。你真的希望SIGINT的处理方式与SIGCHILD相同吗? SIGHUP? SIGUSR1?