Perl:阻塞信号没有延迟,应该是 - >提供测试代码

时间:2009-10-06 14:25:23

标签: c perl posix blocking signals

在Perl脚本中,我写的是我遇到问题,我阻止INTQUIT信号,在反引号中执行一个进程,然后取消阻塞INTQUIT信号。我想阻止INTQUIT到达子进程并将其终止。

脚本在代码中的正确位置成功阻塞和解除阻塞,但是,它不会延迟信号并执行我在阻塞模式下配置的处理程序,正如许多引用所说的那样。我知道它是解锁的,因为我可以在阻塞或解除阻塞命令之前或之后发送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";

1 个答案:

答案 0 :(得分:1)

我几乎可以肯定兰德尔在上面的评论中将其钉在了这一点上,但正确的测试是用strace检查以确认你希望实际发生的信号系统调用。更一般地说,当在系统调用级别工作时,您希望避免与旨在抽象它们的库函数混合。