我想知道是否有一个模块或编译指示定义了由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
..
有几种方法可以做到这一点。您已经看到了一种使用的方法POSIX
,我通常会避免这样做,因为默认情况下它会导入huge当前包中的符号数量(近六百)。即使您通过编写将其限制为所需的名称
use POSIX ':signal_h';
仍有大约五十个名字被输入。这也是一个反复试验才能发现的问题name给定信号的number使用这个模块。
您还可以使用以下命令构建 Perl 构建时使用的信号表:Config https://metacpan.org/pod/Config模块,它导出信号名称及其对应编号的列表$Config{sig_name}
and $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];
output
Signal number 2 is INT
或者您可以使用IPC::Signal https://metacpan.org/pod/IPC::Signal模块方便地封装了所有这些
use strict;
use warnings;
use IPC::Signal 'sig_name';
printf "Signal number 2 is %s\n", sig_name(2);
output
Signal number 2 is INT
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)