我想知道是否有一个模块或编译指示定义了system呼叫返回的信号编号的名称?例如:
use feature qw(say);
use strict;
use warnings;
my $cmd = 'sleep 10';
my $res = system $cmd;
my $signal = $res & 127;
if ( $res == -1 ) {
die "Failed to execute: $!\n";
}
elsif ( $signal == 2 ) {
say " Aborted by user.";
}
elsif ( $signal ) {
printf " Command '%s' Died with signal %d, %s coredump.\n",
$cmd, $signal, ( $? & 128 ) ? 'with' : 'without';
}
Run Code Online (Sandbox Code Playgroud)
而不是$signal == 2,我认为对于代码维护,最好使用类似的东西$signal == SIG_ABRT.
有几种方法可以做到这一点.您已经看到了一种使用方法POSIX,我通常会避免使用它,因为默认情况下它会将大量符号(近六百个)导入到当前包中.即使您通过写作将其限制为您需要的名称
use POSIX ':signal_h';
Run Code Online (Sandbox Code Playgroud)
仍然有大约五十个名字被导入.这也是试错的事来发现名字给它的信号的数量使用此模块.
你也可以构建你的Perl与使用BUIT信号的表Config模块,其中出口信号名称,并在其相应的号码清单$Config{sig_name}和$Config{sig_num}.
use strict;
use warnings;
use Config '%Config';
my @sig_names;
@sig_names[ split ' ', $Config{sig_num} ] = split ' ', $Config{sig_name};
printf "Signal number 2 is %s\n", $sig_names[2];
Run Code Online (Sandbox Code Playgroud)
产量
Signal number 2 is INT
Run Code Online (Sandbox Code Playgroud)
或者您可以方便地使用IPC::Signal包装所有这些的模块
use strict;
use warnings;
use IPC::Signal 'sig_name';
printf "Signal number 2 is %s\n", sig_name(2);
Run Code Online (Sandbox Code Playgroud)
产量
Signal number 2 is INT
Run Code Online (Sandbox Code Playgroud)