2012-07-23 18 views
5

Perl'de bir sinyal işleyici belirtmek istiyorum, ancak ismi kullanarak değil, numarayı kullanmak istiyorum. Bu mümkün bir şekilde mümkün mü? Özellikle öldürmeyle birlikte simetri yokluğu söner. YerineNumarayı kullanarak Perl sinyal işleyicisini belirtin, isim değil,

$SIG{USR2} = \&myhandler; 

Örneğin şu anda ben en iyisi "kullanmak Yapılandırma" etmektir

$SIG{12} = \&myhandler; 

demek ve $ Config'de {sig_name} burnunuzu sokacak istiyorum dayalı perldoc perlipc'deki kod. Bu ayrıntılı ve gereksiz karmaşık görünüyor.

Rasyonel: Son zamanlarda iki durumda bunu istemiştim.

1: Göz ardı etmekle ilgilendiğim sinyalleri hatalı bir şekilde ayarlayan buggy ebeveyn işlemiyle başlatıldım ve her şeyi varsayılan olarak sıfırlamak istiyorum.

foreach my $i (1..32) { $SIG{$i} = 'DEFAULT'; } 

2: Ben ince, as-görünmez-as-olası sarıcı komut dosyası yazıyorum mesela http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679630 gol şey basit ve kaba kuvvet gibi olurdu. Eğer paketlediğim program bir sinyal ile çıkarsa, aynı sinyal ile çıkmak istiyorum. Ancak, birkaç sinyal yakaladım, bu yüzden sinyal işleyicime girmek yerine aslında çıkmam için kendi sinyal işleyicimi temizlemem gerekiyor. Onların sayıları bilmek gerekmez, sadece bir kerede tüm sinyalleri ayarlamak isterseniz

$ret = system("./other-program"); 
$SIG{$ret & 127} = 'DEFAULT'; 
kill $ret & 127, $$; 

cevap

2

İlk soru:

use Config qw(%Config); 

my @sig_name_by_num; 
@sig_name_by_num[ split(' ', $Config{sig_num}) ] = split(' ', $Config{sig_name}); 

$SIG{$sig_name_by_num[12]} = \&handler; 

İkinci soru:

use Config qw(%Config); 

$SIG{$_} = 'DEFAULT' for split ' ', $Config{sig_name}; 

-veya-

$SIG{$_} = 'DEFAULT' for keys %SIG; 

-veya-

$_ = 'DEFAULT' for values %SIG; 

Üçüncü soru

use Config qw(%Config); 

my @sig_name_by_num; 
@sig_name_by_num[ split(' ', $Config{sig_num}) ] = split(' ', $Config{sig_name}); 

my $sig_num = $? & 0x7F; 
$SIG{$sig_name_by_num[$sig_num]} = 'DEFAULT'; 
kill($sig_num => $$); 
2

:

$SIG{$_} = 'DEFAULT' for keys %SIG; 

$Config{sig_name}/$Config{sig_num} kullanılması sadece Amacım böyle bir şey kısa yazmaktır sinyal adlarına numaralar, ancak birçok Unix y sistemlerde çalışır hızlı ve kirli bir şekilde eşleştirmek için taşınabilir bir yolu

$sig_name = qx(kill -l $sig_num); 

($sig_name sonra pra yüzden, bir sondaki yeni satır olacak olan mutlaka bir daha özlü bir işleve çevirdi sürece olsa da, %Config kullanmaktan daha değil That)

chomp($sig_name = qx(kill -l $sig_num)); 
($sig_name) = qx(kill -l $sig_num) =~ /(\S+)/; 

gibi bir şey yapmak ister ctice.

sub sig_no { chomp(my ($sig_no = qx(kill -l $_[0])); $sig_no } 

$SIG{ sig_no($ret & 127) } = 'DEFAULT'; 
... 
+0

ben "tuşlarına% SIG" tekniğinin şüpheli. Makul bir Perl (5.12.4) $ Config {sig_name} 'a gitmenizi tavsiye ediyor ve bunun, tarihsel olarak Perl'e kişisel olarak ayarladığınız sinyalleri kullanarak% SIG'i yerleştirmeye güvenemeyeceğinize inanıyorum. Pratikte, Linux'taki 5.12.4'ün anahtarları doldurduğu görülüyor, ancak bunun, Perl sistemlerinde veya sürümlerinde taşınabilir olduğu net değil. –

İlgili konular