我想知道是否有一个模块或编译指示定义了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';
}
而不是$signal == 2
,我认为对于代码维护,最好使用类似$signal == SIG_ABRT
的内容。
答案 0 :(得分:7)
有几种方法可以做到这一点。您已经看到了使用POSIX
的方法,我通常会避免这种方法,因为默认情况下它会将巨大的个符号(近六百个)导入到当前包中。即使您通过编写
use POSIX ':signal_h';
仍有大约五十个名字被导入。使用此模块发现号的信号的名称也是一个试验和错误的问题。
您还可以使用Config
模块构建一个Perl所包含的信号表,该模块在$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];
<强>输出强>
Signal number 2 is INT
或者你可以使用IPC::Signal
模块,它可以方便地包装所有这些
use strict;
use warnings;
use IPC::Signal 'sig_name';
printf "Signal number 2 is %s\n", sig_name(2);
<强>输出强>
Signal number 2 is INT
答案 1 :(得分:2)
是的,这是在POSIX
模块中定义的:
% perl -e 'use POSIX; printf "%s\n", SIGABRT;'
6