5

私が書いているPerlスクリプトでは、 and シグナルをブロックし、バックティック内でプロセスを実行してから、 and シグナルのブロックを解除するINTという問題があります。またはが子プロセスに到達して強制終了 するのを防ぎたい。QUITINTQUITINTQUIT

スクリプトは、コード内の適切なポイントで正常にブロックおよびブロック解除しますが、多くの参考文献が言うように、ブロック モードにある間、シグナルを遅延させず、構成したハンドラーを実行しません。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";
4

1 に答える 1

1

上記のコメントで Randal がこれを釘付けにしたことはほぼ間違いありませんが、適切なテストは strace を使用して、発生すると予想されるシグナル syscall が実際に発生していることを確認することです。さらに一般的に言えば、システム コール レベルで作業する場合、それらを抽象化することを目的としたライブラリ関数との混在は避けたいと考えます。

于 2009-10-06T22:40:55.107 に答える