2012-07-23 3 views
5

Perlでシグナルハンドラを指定したいのですが、名前ではなく数字を使用します。これは簡潔な方法で可能ですか?キルとの対称性の欠如は特に際立っています。 、代わりに名前ではなく数字を使ってPerlシグナルハンドラを指定してください。

$SIG{USR2} = \&myhandler; 

の例については、私は現時点では私が持っている最高のは、「使用コンフィグ」することである

$SIG{12} = \&myhandler; 

を言うと、$ CONFIG {数sig_name}でつつくしたいのですが、上のベースperldoc perlipcのコード。これは冗長であり、不必要に複雑に見えます。

理論的根拠:私は最近2つのケースでこれを望んでいました。

1:私が気にする信号を間違って設定しているバグの親プロセスによって開始されています。すべてをデフォルトにリセットしたいだけです。

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

2:私は薄い、など-目に見えない-AS-可能ラッパースクリプトを書いている例えばhttp://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679630目標は何か、シンプルでブルートフォースは次のようになります。私がラッピングしているプログラムがシグナルで終了するなら、同じシグナルで終了したいと思います。しかし、私はいくつかのシグナルを捕捉するので、シグナルハンドラに入る代わりに実際に終了するために、自分自身のシグナルハンドラをクリアする必要があります。あなたは自分の番号を知っている必要はありません、あなただけ一度にすべての信号を設定したい場合は

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

答えて

2

最初の質問:

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; 

2番目の質問:

use Config qw(%Config); 

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

- または -

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

- または -

$_ = 'DEFAULT' for values %SIG; 

3番目の質問

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}を使用しただけで私の目標は、このような何かを簡単に書くことです信号名に数字が、多くのUnix-yのシステム上で動作します間に合わせの道をマッピングするためのポータブルな方法は

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

$sig_nameはその後、PRAにおけるので、改行を持つことになりますですあなたは

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

のような何かをしたいと思いますctice)

あなたが機能に変えない限り、しかし、必ずしもより簡潔な%Configを使用するよりもありません。

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

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

私は "キー%SIG" 技術の怪しげなよ。合理的に最近のPerl(5.12.4)は、$ Config {sig_name}に行くことをお勧めします。これは、歴史的に、あなたが個人的に設定していなかったシグナルで%SIGを埋め込むことはできませんでした。実際には、Linux上の5.12.4がキーを入力するように見えますが、それはPerlのシステムやバージョン間で移植可能であることは明らかではありません。 –

関連する問題