在我正在编写的 Perl 脚本中,我遇到了一个问题,我阻塞了INT
andQUIT
信号,在反引号内执行一个进程,然后解除阻塞INT
andQUIT
信号。我想防止 aINT
或 aQUIT
到达子进程并杀死它。
该脚本在代码中的正确位置成功地阻塞和解除阻塞,但是,它不会延迟信号并在它处于阻塞模式时执行我配置的处理程序,正如许多参考资料所说的那样。我知道它正在解除阻止,因为我可以在阻止或解除阻止命令之前或之后发送一个SIGINT
并且它受到尊重。
操作系统: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";