信号编号2的名称

时间:2015-04-25 07:08:31

标签: perl

我想知道是否有一个模块或编译指示定义了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的内容。

2 个答案:

答案 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