使用数字而不是名称指定Perl信号处理程序

Ala*_*met 5 perl signals handler

我想在Perl中指定一个信号处理程序,但是使用数字,而不是名称.这可能是一种简洁的方式吗?与杀戮缺乏对称特别突出.例如,而不是

$SIG{USR2} = \&myhandler;
Run Code Online (Sandbox Code Playgroud)

我想说

$SIG{12} = \&myhandler;
Run Code Online (Sandbox Code Playgroud)

我目前最好的是"使用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'; }
Run Code Online (Sandbox Code Playgroud)

2:我正在编写一个薄的,尽可能不可见的包装脚本.如果我正在包装的程序以信号退出,我想以相同的信号退出.但是,我捕获了一些信号,所以我需要清除自己的信号处理程序以确保我实际退出而不是进入我的信号处理程序.我的目标是写一些这样简短的东西:

$ret = system("./other-program");
$SIG{$ret & 127} = 'DEFAULT';
kill $ret & 127, $$;
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 3

第一个问题:

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;
Run Code Online (Sandbox Code Playgroud)

第二个问题:

use Config qw( %Config );

$SIG{$_} = 'DEFAULT' for split ' ', $Config{sig_name};
Run Code Online (Sandbox Code Playgroud)

-或者-

$SIG{$_} = 'DEFAULT' for keys %SIG;
Run Code Online (Sandbox Code Playgroud)

-或者-

$_ = 'DEFAULT' for values %SIG;
Run Code Online (Sandbox Code Playgroud)

第三个问题

use Config qw( %Config );

my @sig_name_by_num;
@sig_name_by_num[ split(' ', $Config{sig_num}) ] = split(' ', $Config{sig_name});

my $sig_num = $? & 0x7F;
$SIG{$sig_name_by_num[$sig_num]} = 'DEFAULT';
kill($sig_num => $$);
Run Code Online (Sandbox Code Playgroud)