2009-10-06 8 views
5

私は、INTQUITシグナルをブロックし、バックティック内でプロセスを実行してブロックを解除する問題を抱えています。 INTおよびQUITシグナル。 INTまたはQUITが子プロセスに到達してそれを強制終了しないようにします。Perl:ブロックされているシグナルが遅延していない - >テストコードが提供されました

スクリプトは、コード内の正しいポイントで正常にブロックおよびブロック解除されますが、信号を遅延させず、ブロックモードになっている間に設定したハンドラを実行しません。ブロックまたはブロック解除コマンドの前または後にSIGINTを送信することができ、それが尊重されているため、ブロック解除されていることが分かります。

OS:Linuxの2.6.30 Perlのバージョン:5.8.8

コードスニペット:

#!/usr/local/bin/perl 

use POSIX qw(:signal_h); 

$SIG{'INT'} = 'gracefulExit'; 
sub gracefulExit { print "Caught Signal = GOOD\n"; exit; } 

print "Recieving a SIGINT works here\n"; 
sleep 5; 
my $sigset = POSIX::SigSet->new; 
my $blockset = POSIX::SigSet->new(SIGINT); 
sigprocmask(SIG_BLOCK, $blockset, $sigset) or die "dying at block...\n"; 
print "Recieving a SIGINT doesn't work here [GOOD!] and is NOT delayed [WHY!?].\n"; 
`/bin/sleep 5`; 
sigprocmask(SIG_UNBLOCK, $blockset) or die "dying at unblock...\n"; 
print "Recieving a SIGINT works here again [GOOD!]\n"; 
sleep 5; 
print "Exited without receiving a signal\n"; 
+0

これはどのオペレーティングシステムですか? – hlovdal

+0

OS:Linux 2.6.30 –

+6

「システム」またはqx(バッククォートとも呼ばれます)は使用しないでください。どちらも、最も一般的なユーザーが望む方法で信号を設定します。代わりにfork/execを使用すると、信号を正確に制御できます。 –

答えて

1

私はすべてが、特定のランダルは、上記のコメントでこれを釘付け、しかし、適切なテストがあるんですstraceを調べて実際に起こっていると思われる信号システムコールが実際に存在することを確認します。そして、より一般的には、システムコールレベルで作業するときに、それらを抽象化しようとしているライブラリ関数との混同を避けたいとします。

+0

アンディとランダルありがとう!それはすべて完了し、今良いです。 –

関連する問題