私は、INT
とQUIT
シグナルをブロックし、バックティック内でプロセスを実行してブロックを解除する問題を抱えています。 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";
これはどのオペレーティングシステムですか? – hlovdal
OS:Linux 2.6.30 –
「システム」またはqx(バッククォートとも呼ばれます)は使用しないでください。どちらも、最も一般的なユーザーが望む方法で信号を設定します。代わりにfork/execを使用すると、信号を正確に制御できます。 –