信号编号2的名称

Håk*_*and 3 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';
}
Run Code Online (Sandbox Code Playgroud)

而不是$signal == 2,我认为对于代码维护,最好使用类似的东西$signal == SIG_ABRT.

Bor*_*din 7

有几种方法可以做到这一点.您已经看到了一种使用方法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)

  • @HåkonHægland:那会有用,但你还是要检查所有`POSIX :: SIGXXX`值来找到你要找的那个 (2认同)