2015-04-25 37 views
3

我想知道是否有一個模塊或編譯指示定義了system調用返回的信號編號的名稱?例如:信號名稱2

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

是的,這是在POSIX模塊定義:

% perl -e 'use POSIX; printf "%s\n", SIGABRT;' 
6 
+0

謝謝..我認爲這是SIGINT呢? –

+3

正確,SIGINT是2。在Linux中,你可以用'kill -l'列出它。 – tivn

6

有幾種方法可以做到這一點。您已經看到了一種使用POSIX的方法,我通常會避免這種方法,因爲默認情況下,它會將大量符號(近六百個)導入當前包中。即使通過書寫將其限制到您需要的名稱

use POSIX ':signal_h'; 

仍有大約50個名稱導入。使用此模塊發現號碼名稱也是試錯的問題。

您還可以使用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 
+0

'使用POSIX();我的$ sigint = POSIX :: SIGINT;'。那應該避免導入所有符號? –

+2

@HåkonHægland:這可以工作,但你仍然需要檢查所有'POSIX :: SIGXXX'值來找到你要找的那個值 – Borodin