我想在Perl中指定一个信号处理程序,但是使用数字,而不是名称.这可能是一种简洁的方式吗?与杀戮缺乏对称特别突出.例如,而不是
$SIG{USR2} = \&myhandler;
我想说
$SIG{12} = \&myhandler;
我目前最好的是“使用Config”并根据perldoc perlipc中的代码在$Config {sig_name}中查找.这很冗长,似乎不必要地复杂化.
理由:我最近在两个案例中想要这个.
1:我是由一个错误的父进程启动的,他错误地设置了我忽略的信号,我想将所有内容重置为默认值.例如http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679630目标将是简单而蛮力的东西:
foreach my $i (1..32) { $SIG{$i} = 'DEFAULT'; }
2:我正在编写一个薄的,尽可能不可见的包装脚本.如果我正在包装的程序以信号退出,我想以相同的信号退出.但是,我捕获了一些信号,所以我需要清除自己的信号处理程序以确保我实际退出而不是进入我的信号处理程序.我的目标是写一些这样简短的东西:
$ret = system("./other-program"); $SIG{$ret & 127} = 'DEFAULT'; kill $ret & 127,$$;
解决方法
第一个问题:
use Config qw( %Config ); my @sig_name_by_num; @sig_name_by_num[ split(' ',$Config{sig_num}) ] = split(' ',$Config{sig_name}); $SIG{$sig_name_by_num[12]} = \&handler;
第二个问题:
use Config qw( %Config ); $SIG{$_} = 'DEFAULT' for split ' ',$Config{sig_name};
-要么-
$SIG{$_} = 'DEFAULT' for keys %sIG;
-要么-
$_ = 'DEFAULT' for values %sIG;
第三个问题
use Config qw( %Config ); my @sig_name_by_num; @sig_name_by_num[ split(' ',$Config{sig_name}); my $sig_num = $? & 0x7F; $SIG{$sig_name_by_num[$sig_num]} = 'DEFAULT'; kill($sig_num => $$);